目的:解决微服务在调用远程服务时URL写死的问题
注册中心
服务提供者(Server):一次业务中,被其他微服务调用的服务,也就是提供接口给其他微服务。
服务消费者(Client):一次业务中,调用其他微服务的服务,也就是调用其他微服务提供的接口
服务注册中心(Register):用于保存Server的注册信息,当Server节点发生变更时,Register会同步变更,服务与注册中心使用一定机制通信,如果注册中心与某服务长时间无法通信,就会注销该实例。
关系:
服务注册:服务提供者在启动时,想Register注册自身服务,并向Register定期发送心跳汇报存活状态
服务发现:服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口,服务发现的一个重要作用就是提供给服务消费者一个可用的服务列表
CAP理论
一致性(Consistency):CAP理论中的一致性,值的是强一致性,所有节点在同一时间具有相同的数据
可用性(Availability):保证每一个请求都有响应(结果不保证)
分区容错性(Partition Tolerance) :当出现网络分区后,系统任然能够对外提供服务
Eureka
Eureka是Netflix开发的基于REST的服务发现框架, 主要⽤于服务注册, 管理,负载均衡和服务故障转移. 官⽅声明在Eureka2.0版本停⽌维护, 不建议使⽤. 但是Eureka是SpringCloud服务注册/发现的默认实现, 所以⽬前还是有很多公司在使⽤
搭建EurekaServer:
引入依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是
⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为falseregister-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于
当前应⽤就是Eureka Server,故⽽设置为false.service-url:# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
服务注册:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka
远程调用:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
spring:application:name: product-service
eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka
配置RestTemplate对象,用于发起URL远程调用请求
根据url和返回值的类调用远程接口
获取远程实例,instances[index].getUri()可以获取IP+端口号
负载均衡
配置负载均衡所需访问的服务名 configuration配置均衡策略
IP+端口号直接用注册中心的服务名代替