EurekaServer是服务注册中心,提供服务注册,即其他微服务可注册进该服务
EurekaClient通过注册中心进行访问,即将要注册进EurekaServer的微服务
Eureka主要是用于管理所有微服务,实现负载均衡,故障容错,服务注册于发现
之前是订单模块直接调支付模块,现在将两个模块注册进服务注册中心,订单模块会通过Eureka去调支付模块
构建EurekaServer端微服务作为服务注册中心:
创建子模块cloud-eureka-server7001,端口为7001,pom中拉取eureka-server的包,编写外部配置yml文件,启动类添加注解
测试:启动该子模块后,可以访问到eureka的页面
将订单模块和支付模块作为EurekaClient注册进Eureka服务端:
在这两个子模块中,拉取依赖,编写yml,启动类添加注解
测试:启动服务注册中心模块和订单、支付模块,浏览器输入:http://localhost:7001/ 访问eureka主页时,可以看到已经注册进来的两个子模块
作为eureka的服务端和客户端,拉取的依赖、yml配置、启动类的注解都是相对应的
只有一个eureka服务端子模块是单机eureka,当有多个eureka服务端子模块相互关联时,是集群eureka
搭建eureka集群:
参考7001服务注册中心子模块新建一个cloud-eureka-server7002注册中心子模块
pom中拉取依赖
修改本机hosts文件,自定义两个网址,指向127.0.0.1
两个服务注册中心子模块的yml配置:设置模块名称,同时指向对方
启动类的注解
测试:浏览器输入:http://eureka7002.com:7002 由于hosts配置,eureka7002.com指向的是127.0.0.1 ,访问的端口是7002,也就是访问的7002子模块的eureka页面,在该页面中可以看到关联的7001子模块,
同样输入http://eureka7001.com:7001访问7001的eureka页面,关联了7002子模块
单模块加入两台eureka服务器(eureka集群):
在订单模块的yml中配置:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
将支付模块加入两台eureka服务器(eureka集群):
在支付模块的yml中配置:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
微服务提供者的集群:
当我们的80订单子模块去调用支付子模块时,支付子模块作为微服务的提供者应该有多个,可供80消费者调用,所以需搭建消费者集群
新建cloud-provider-payment8002,和8001模块一样,只需修改yml中的端口,模块名称一致;提供者对外曝露的是一个名称
如何判断80订单模块是调用的8001还是8002:在8001和8002的controller中注入各自的端口号,调用时返回端口号即可
实现负载均衡:使用80调用支付模块时,
打开eureka页面可以发现,80模块进入eureka,通过名称Application去找支付模块;需将80模块控制层中,要找的支付模块的url修改为对应的名称
同时在80模块的restTemplate配置类中添加注解:@LoadBalanced
测试如下:轮巡机制,访问不同的支付模块
修改eureka页面中注册了的主机名称Status:
修改订单或字符模块的yml:
eureka:
instance:
instance-id: payment8001
在eureka页面,鼠标放到主机名称上时,显示IP
修改订单或字符模块的yml:
eureka:
instance:
prefer-ip-address: true
案例:获取8001模块注册到eureka中的信息
在8001模块的控制类添加如下:注入DiscoveryClient,通过它获取服务信息
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("discovery")
public Object discovery() {
List<String> services = discoveryClient.getServices();
services.forEach(service->{
System.out.println("----service"+service);
});
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
System.out.println(instance.getServiceId()+"\t" + instance.getHost()+"\t"+ instance.getPort()+"\t"+instance.getUri());;
}
return this.discoveryClient;
}
在8001启动类上添加注解@EnableDiscoveryClient
启动eurekaServer、8001,浏览器中访问该接口:http://localhost:8001/payment/discovery
返回服务信息:
在eureka页面默认有一段红色文本,eureka默认开启保护机制,表示注册了eureka的某个微服务出现了故障,不会立即清楚,依然会对服务信息保存
如果禁用自我保护机制,eureka页面的红色文本会显示关闭,同时服务出现故障时会自动清除
关闭方法:
在eurekaServer端7001模块配置yml
eureka:
server:
enable-self-preservation: false #关闭自我保护机制,保证不可用服务立即被踢出
eviction-interval-timer-in-ms: 2000 # eureka服务端向客户端发送心跳的时间间隔为2秒
在eurekaClient端8001模块配置yml
eureka:
instance:
lease-renewal-interval-in-seconds: 1 # 客户端向eureka服务端发送心跳的时间间隔
lease-expiration-duration-in-seconds: 2 # 服务端等待的时间上限,超出则清除
测试:启动这两个模块,eureka页面中8001能显示,之后在idea中停用8001,eureka页面刷新后8001服务就被清除了