代码上传到:https://github.com/13thm/study_springcloud/tree/main/days3
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理
Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))
下左图是Eureka系统架构,右图是Dubbo的架构,请对比
Eureka包含两个组件:Eureka Server和Eureka Client
具体看代码
修改之前的cloud-provider-payment8001
1.修改pom文件,添加配置
2.在主类添加注解
3.在yml修改配置
具体看代码
4.测试 http://localhost:7001/
1.pom
2.主启动类 ,加注解
3.写yml
具体请看代码
1.改POM
2.修改映射配置
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
3.写YML
7001 改
7002 改
具体看代码
将支付服务8001微服务发布到上面2台Eureka集群配置中 --改YML
将订单服务80微服务发布到上面2台Eureka集群配置中--改YML
先要启动EurekaServer,7001/7002服务,再要启动服务提供者provider,8001,再要启动消费者,80
测试网址:
http://eureka7002.com:7002/
http://eureka7001.com:7001/
http://localhost/consumer/payment/get/1
1.新建cloud-provider-payment8002(跟8001 几乎一致)
2.改POM
3.写YML
4.主启动
5.业务类(粘贴过来)
6.修改8001/8002的Controller
主要还是看代码
哪里变化了
添加:
@Value("${server.port}")
private String serverPort;
修改了返回值:添加了服务端口
return new CommonResult(200,"插入成功,返回结果"+result+"\t 服务端口:"+serverPort,payment);
return new CommonResult(200,"查询成功"+"\t 服务端口:"+serverPort,payment);
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
测试:
http://localhost/consumer/payment/get/1
http://eureka7001.com:7001/eureka
鼠标放上去没有显示ip地址
修改8001的yml 和8002的yml
添加
instance:
instance-id: payment8001
prefer-ip-address: true #访问路径可以显示IP地址
instance:
instance-id: payment8002
prefer-ip-address: true #访问路径可以显示IP地址
对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息
修改cloud-provider-payment8001的Controller 和 修改cloud-provider-payment8002的Controller
添加以下代码:(具体看下载代码)
@Resource
private DiscoveryClient discoveryClient;
@GetMapping(value = "/payment/discovery")
public Object discovery()
{
List<String> services = discoveryClient.getServices();
for (String element : services) {
System.out.println(element);
}
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance element : instances) {
System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.discoveryClient;
}
在8001 和8002主启动类添加注解@EnableDiscoveryClient
http://localhost:8001/payment/discovery
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,
Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存
出厂默认,自我保护机制是开启的:
eureka.server.enable-self-preservation=true
要把他关闭,使用eureka.server.enable-self-preservation = false
可以禁用自我保护模式(注册中心eureakeServer端7001 的yml 里面改)
server:
port: 8001
###服务名称(服务注册到eureka名称)
spring:
application:
name: cloud-provider-payment
eureka:
client: #服务提供者provider注册进eureka服务列表内
service-url:
register-with-eureka: true
fetch-registry: true
# cluster version
#defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
# singleton version
defaultZone: http://eureka7001.com:7001/eureka
#心跳检测与续约时间
#开发时设置小些,保证服务关闭后注册中心能即使剔除服务
instance:
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
lease-expiration-duration-in-seconds: 2