1、Eureka
1、什么是服务治理
SpringCloud封装了Netflix公司开发的Eureka模块来实现服务治理
在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
2、什么是服务注册
Eureka采用C/S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册中心,而系统中的其他微服务,使用Eureka的客户端连接到Eureka Server并保持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息比如服务地址、通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系。在任何RPC远程框架中,都会有一个注册中心(存放服务地址相关信息,例如接口地址等)
3、Eureka组件
Eureka包含连个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个微服务节点通过配置启动后,会在Eureka Server中进行注册,这样在Eureka Server中的服务注册表中将会存储可用的服务节点信息,服务节点的信息可以在界面中直观看到。
Eureka Client通过注册中心进行访问
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认30秒发一次)。如果Eureka Server在多个心跳周期都没有接收到某个节点的心跳,则Eureka Server会从服务注册表中将该节点移除(默认90秒)
4、Eureka单机版
1、新建Eureka-Server,加入pom依赖
dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>/
2、编写配置文件
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服务区实例名称
client:
#不注册自己本身
register-with-eureka: false
#代表自己就是服务端
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3、开启注解
@EnableEurekaServer
1、新建Eureka提供者Eureka-Provider,加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、编写配置文件
server:
port: 8001
eureka:
client:
#将自己注册到服务中心
register-with-eureka: true
#是否从Eureka Server获取已经注册的信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka
3、添加注解
@EnableEurekaClient
1、新建消费者Eureka-Customer,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、编写配置文件
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/
3、添加注解
@EnableEurekaClient
4、配置RestTemplate
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
5、通过restTemplate远程调用提供者服务
public static final String PAYMENT_URL = "http://localhost:8001/payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPaymentByID(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL + "/get/" + id, CommonResult.class);
}
5、Eureka集群版
1、新建Eureka-Server7001和7002,将其相互注册
Eureka-7001配置如下
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #集群版
#hostname: localhost #eureka服务区实例名称 单机版
client:
#不注册自己本身
register-with-eureka: false
#代表自己就是服务端
fetch-registry: false
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机版
defaultZone: http://eureka7002.com:7002/eureka/
Eureka-7002配置如下
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com
#hostname: localhost #单机版
client:
register-with-eureka: false
fetch-registry: false
service-url:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机版
defaultZone: http://eureka7001.com:7001/eureka/ #集群版
2、新建两个服务提供者,并将其注册到两个服务中心内,两个服务提供者的spring.application.name要相同。
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
3、新建消费者80,
在restTemplate的Bean上加上@LoadBalanced注解开启负载均衡,默认是轮询。
修改restTemplate初始化URL,将其从单机端口改为服务的名称
public static final String PAYMENT_URL = "http://PROVIDER-PAYMENT-SERVICE"
6、Actuator和DiscoverClient
1、添加配置文件
eureka:
instance:
instance-id: payment-8002 #修改id
prefer-ip-address: true #显示ip端口
2、通过注入DiscoverClient获取注册中心上服务信息以及服务实例。
在主启动类上加@EnableDiscoveryClient
7、禁止自我保护和改变心跳时间与等待时间
1、默认Eureka在90秒没有收到服务心跳则开启自我保护机制,自我保护机制内不会剔除任何服务,在CAP理论里体现了AP原则,可用性(Availability)、分区容错性(Partition tolerance)。
在服务端可以通过配置将其自我保护关闭
eureka.server.enable-self-preservation=false
2、改变客户端发送心跳的时间
Eureka客户端默认30秒发一次心跳,通过配置将其改变
eureka.instance.lease-renewal-interval-in-seconds=10 #改为10秒发一次心跳
3、改变Eureka服务端在收到最后一次心跳后等待的时间上限,默认90秒,超时没有收到心跳则剔除服务
eureka.instance.lease-expiration-duration-in-seconds=20 #改为20秒
2、Zookeeper
1、使用Docker拉取Zookeeper
拉取完成以后启动zookeeper,使用docker exec -it xxx bash/bin进去容器,进去bin目录后输入 ./zkCli.sh进入服务端查看,
常用命令
ls /
get /zookeeper
get /service
get /service/xxx
get /dubbo
2、提供者
1、新建项目,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
2、编写配置文件
spring:
application:
name: provider-payment-service
cloud:
zookeeper:
connect-string: xxx.xxx.xxx.xxx:2181
3、启动类上加入@EnableDiscoveryClient注解启动服务,查看zookeeper即可
3、消费者
1、同理新建项目,添加pom依赖
2、编写配置文件,和上述一样
3、在启动类添加@EnableDiscoverClient
4、编写配置类,注入RestTemplate,添加@Balanced
5、通过restTemplate调用提供者即可
4、Zookeeper特点
Zookeeper不是持久的,如果节点断点重新恢复,分配的id会和之前不同。
3、Consul
1、使用docker拉取consul
1、查询consul
docker search consul
2、拉取consul
docker pull consul:x.x.x
3、启动镜像
docker run -d -p 8500:8500 --name consul consul:1.6.1
2、配置提供者和消费者
1、基本和zookeeper差不多配置,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
2、编写提供者和消费者配置文件,基本类似,写一个提供者
server:
port: 8006
spring:
application:
name: provider-payment-8006
cloud:
consul:
host: xxx.xxx.xxx.xxx
port: 8500
discovery:
#指定开启ip地址注册
prefer-ip-address: true
3、查看consul的8500端口查看服务注册信息
4、因为本次将服务注册到阿里云服务器上,本地服务健康,但consul需要调用本地的actuator/health无法访问到本机,所有有一个红X,目前没找到好的解决办法,日后在解决。