一.搭建springcloud父工程
1.创建一个maven工程(如图所示,框起来的除外)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iMwIWMkNDMhZGZhFmMxUmY1czY0YzMyEmZwUDO2ITZi9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
2.修改为pom.xml改如图处位置为图示范样子
3.在pom文件里添加(springboot和springcloud版本号要对应,否则会报错)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR11</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
二.创建两个子工程并测试
1.创建两个子工程,并实现对外访问方法
在其中一个工程的启动类里添加
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
然后创建一个访问类添加如下
@Autowired
private RestTemplate restTemplate;//Spring提供了一个RestTemplate模板工具类,对基于HTTP的客户端进行了封装,并且实现了对象与json的序列化 和反序列化
@GetMapping("")
public Object query(){
String url="另一个工程对外访问地址";
return restTemplate.getForObject(url,Object.class);
}
2.然后启动两个子工程,可在有RestTemplate对象的工程里访问另一个工程
三.Eureka注册中心
1.创建两个(搭建集群简单演示)子工程并在pom文件里添加
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
在启动类上添加
@EnableEurekaServer
注解
2.在配置文件里添加
server:
port: 端口
spring:
application:
name: 服务名称
eureka:
client:
service-url:
#EurekaServer地址,多个地址以','隔开
defaultZone: 另一个服务地址/eureka
server:
# 注册自己
register-with-eureka: true
# 抓取服务
fetch-registry: true
eviction-interval-timer-in-ms: 1000
3.分别启动测试
DiscoveryClient类的方法getInstances("服务名称")可根据服务名称,获取服务实例
List<ServiceInstance> serviceInstances = discoveryClient.getInstances("服务名称");
4.Eureka Client向Eureka Server进行注册的时候默认采用的是IP Address方式
如果采用主机名的方式进行注册服务,只需要修改配置文件的
eureka.instance.hostname=配置使用主机名注册服务
如果在上面已经配置的情况下想用IP则需要修改配置文件
eureka:
instance:
# 自定义实例编号
instance-id: 编号
ip-address: 127.0.0.1 # ip地址
prefer-ip-address: true # 更倾向于使用ip,而不是host名
5.在注册服务完成以后,服务提供者会维持一个心跳,可通过如下修改
eureka:
instance:
lease-expiration-duration-in-seconds: 90 #服务失效时间,默认值90秒
lease-renewal-interval-in-seconds: 30 #服务续约(renew)的间隔,默认为30秒
默认情况下每个30秒服务会向注册中心发送一次心跳,如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除
6.拉取并更新数据
服务消费者启动时,会检测 eureka.client.fetch-registry=true 参数的值,如果为true,则会从Eureka Server服务的列表拉取只读备份,然后缓存在本地。每隔30秒 会重新拉取并更新数据。可通过在消费者添加以下配置更改
eureka:
client:
registry-fetch-interval-seconds: 30
7.服务剔除与自我保护
服务注册中心在启动时会创建一个定时任务,默认每隔一段时间 (默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除,这个操作被称为失效剔除。 可以通过eureka.server.eviction-interval-timer-in-ms 参数对其进行修改,单位是毫秒。
当一个服务未按时进行心跳续约时,Eureka会统计最近15分钟心跳失败的服 务实例的比例是否超过了85%,当EurekaServer节点在短时间内丢失过多客户端(可能发生了网络分区故障)。在 生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因 为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。
可通过下面配置修改
eureka:
server:
enable-self-preservation: false # 关闭自我保护模式(缺省为打开) eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)
四.负载均衡Ribbon
1.Eureka中已经集成了在RestTemplate的配置方法上添加 @LoadBalanced 注解即可
2.默认是轮询,可通过以下方式配置成随机
服务名称:
ribbon:
NFLoadBalancerRuleClassName:
com.netflix.loadbalancer.RandomRule