服务注册中心
在微服务架构中,注册中心是最基础的核心功能之一,微服务集群一多,管理就麻烦,这时候注册中心就出场了,管理服务和服务之间的依赖关系,还可以实现服务调用,负载均衡,容错等,实现服务发现与注册。
一.Eureka
包含两个组件: Eureka服务端(提供服务注册服务)和Eureka客户端(通过注册中心进行访问)。
单机 Eureka构建:
1.导入依赖:
2.主启动类:
3.配置文件
server:
port: 7001 #指定服务端口
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
#defaultZone: http://eureka7002.com:7002/eureka/
#单机就是7001自己
defaultZone: http://eureka7001.com:7001/eureka/
#server:
#关闭自我保护机制,保证不可用服务被及时踢除
#enable-self-preservation: false
#设置若客户端20s未发送心跳包就剔除服务
#eviction-interval-timer-in-ms: 2000
客户端的话包括生产者和消费者:
导入依赖:
主启动类:
生产者注册进Eureka配置文件:
server:
port: 8002
spring:
application:
name: cloud-payment-service #服务名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版
instance:
instance-id: payment8002
prefer-ip-address: true #访问路径可以显示IP地址
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.atguigu.springcloud.entities # 所有Entity别名类所在包
消费者进注册中心配置文件:
server:
port: 80
spring:
application:
name: cloud-order-service #服务名
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: false
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#单机
#defaultZone: http://localhost:7001/eureka
# 集群
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版
集群版的Eureka就是相互注册,而生产者和消费者就需要把Eureka都写上,这个时候就需要负载均衡,不然消费者将找不到哪个服务。
RestTemplate是服务跟服务之间交流的桥梁,在配置这个的时候加上一个 @LoadBalanced 就可以实现负载均衡。
Eureka还有一个保护机制,就是当一个服务宕机时,并不会马上将这个服务剔除,而是等一段时间。
服务发现是用于获取注册进注册中心服务的信息的。
使用:
主启动类:
在Controller中注入:
使用:
@GetMapping(value = "/payment/discovery")
public Object discovery()
{ //获取在注册中心注册的服务有哪些
List<String> services = discoveryClient.getServices();
for (String element : services) {
log.info("*****element: "+element);
}
//获取在"CLOUD-PAYMENT-SERVICE"中包含多少个实例
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
for (ServiceInstance instance : instances) {
log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
}
return this.discoveryClient;
}
Zookeeper
zookeeper的使用其实和Eureka差不多,不过需要下载并运行,同时他没有Eureka“仁慈”,一个服务一旦出现宕机,Zookeeper会马上剔除,在服务归来时会重新分配一个ID号。
生产者注册进Zookeeper:
消费者注册进Zookeeper:
导入依赖:
<!-- SpringBoot整合zookeeper客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--先排除自带的zookeeper3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.9版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
Consul
同样也是需要下载的,拥有自己的图形界面,下载启动后即可,也是没有那么“仁慈”。
导入依赖:
<!--SpringCloud consul-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
生产者配置文件:
消费者配置文件:
三个注册中心的异同点:
AP的Eureka有时候不是那么在乎数据的一致,在乎的是系统的可用性,而CP的Consul和Zookeeper一旦一个服务宕机,就会停止给消费者提供服务,保证数据的一致性。
二.负载均衡(Ribbon)
当导入了Eureka客户端的依赖时,就有了Ribbon的负载均衡。
默认是轮询(就是一个个的使用),
还有这么多负载均衡的规则:
当我们想换一个负载均衡的规则时,可以自己配置,注意配置所在的包不能在Compantscan扫描的地方。例如:
主启动类上:
负载均衡的算法就是:
Rest接口请求的次数%服务器集群总数量=实际调用服务器的下标,每次重启服务请求都会从 1 开始。