Java

微服务架构下的服务治理:如何在 SpringCloud 框架中实

2021-05-04  本文已影响0人  程序花生

服务治理

服务注册与发现

注册中心

server.port=8761    # 服务端口号
eureka.instance.hostname=127.0.0.1  # 注册中心IP地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/  # 注册url地址
eureka.client.register-with-eureka=false    # 是否将自己注册到注册中心(集群时需要注册)
eureka.client.fetch-registry=false  # 是否需要到注册中心检索服务信息
复制代码
1.在主类上标注@EnableEurekaServer注解开启EurekaServer服务,开启注册中心

服务注册

server.port=8001    # 服务提供者(Provider)服务端口号
spring.application.name=Ticket-Service  # 服务别名,注册到注册中心的名称:serviceId
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/  # 服务提供者(Provider)注册到eureka注册中心的url地址
eureka.client.register-with-eureka=true # 是否将自己注册到注册中心
eureka.client.fetch-registry=true   # 是否需要到注册中心检索服务信息
1.在主类上标注@EnableEurekaClient注解将服务提供者(Provider)服务注册到注册中心

服务发现

server.port=8200    # 服务消费者(Consumer)服务端口号
spring.application.name=Ticket-User # 服务别名,注册到注册中心的名称:serviceId
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/  # 服务提供者(Provider)调用服务eureka注册中心的url地址
eureka.client.register-with-eureka=true # 是否将自己注册到注册中心
eureka.client.fetch-registry=true   # 是否需要到注册中心检索服务信息
1.在SpringCloud有两种方式调用服务:Rest    Fegin(SpringCloud)
Rest:
- 使用RestTemplate,是SpringBoot的web组件,默认整合Ribbon负载均衡器.底层就是采用的HttpClient技术
- 创建RestTemplate并标注@Bean添加方法创建Http服务进行通信
- RestTemplate调用有两种方式:采用服务别名调用  直接url调用 
restTemplate.getForObject("providerName(替代IP地址)/providerUrl",String.class)
2.在主类上标注@EnableEurekaClient(@EnableDiscoveryClient)注解开启服务消费者(Consumer)从注册中心发现服务功能
3.使用Rest方式以别名方式调用需要依赖Ribbon负载均衡器,在RestTemplate方法上标注
  @LoadBalanced,让RestTemplate在请求时拥有客户端的负载均衡的能力

集群

server.port=9000    # 服务端口号
spring.application.name=euraka  # 注册中心集群上服务器的名称要保持一致
eureka.instance.hostname=127.0.0.1  # 注册中心IP地址
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:8761/eureka/    # ,注册到其它注册中心的url地址
eureka.client.register-with-eureka=true # 是否将自己注册到注册中心(集群时需要注册)
eureka.client.fetch-registry=true   # 是否需要到注册中心检索服务信息

Eureka自我保护机制

1.默认情况下,EurekaClient端定时向EurekaServer端发送心跳包
2.如果EurekaServer端在<一定时间>内没有收到EurekaClient端发送的心跳包,便会直接从服务注册列表中剔除该服务
3.在<短时间>内如果丢失了大量的服务实例心跳包,EurekaServer端会开启自我保护机制,不会剔除EurekaClient端
配置文件:
EurekaServer端:
eureka.server.enable-self-preservation=false        # 是否开启自我保护机制(默认开启true) 
eureka.server.eviction-interval-timer-in-ms=2000    # 剔除间隔2秒

EurekaClient端-服务提供者(Provider):
# 心跳检测和续约时间,在测试程序时,将值设置小些,保证服务关闭后,注册中心及时剔除服务
eureka.instance.lease-renewal-interval-in-seconds=1 # EurekaClient端向EurekaServer端发送心跳的时间间隔秒
eureka.instance.lease-expiration-duration-in-seconds=2  #   EurekaServer端在收到最后一次心跳之后等待时间上限秒,超过就剔除服务

Zookeeper

配置文件:
ZookeeperClient-服务提供者(Provider):
server.port=8090    # 服务端口号
spring.application.name=zk-ticket   # 服务别名,注册到注册中心的名称
spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #注册到zookeeper注册中心的url地址 

ZookeeperClient-服务消费者(Consumer):
server.port=8020    # 服务端口号
spring.application.name=zk-user # 服务别名,注册到注册中心的名称
spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #调用服务的zookeeper注册中心的url地址

1.ZookeeperClient-服务提供者(Provider)在主类上标注@EnableDiscoveryClient注解向注册中心注册服务
2.ZookeeperClient-服务消费者(Consumer)在主类上标注@EnableDiscoveryClient注解从注册中心调用服务
3..在调用服务的方法上标注@LoadBalanced开启Ribbon的负载均衡功能进行服务的调用

Consul

配置文件:
ConsulClient-服务提供者(Provider):
server.port=8780    # 服务端口号
spring.application.name=consul-ticket   # 服务别名,注册到注册中心的名称
spring.cloud.consul.host=127.0.0.1      # Consul服务url地址
spring.cloud.consul.port=8500           # Consul服务端口号
spring.cloud.consul.discovery.hostname=192.168.66.128   # 服务在注册中心显示的IP地址(默认情况下,服务注册到注册中心,地址随机生成)

ConsulClient-服务消费者(Consumer):
server.port=8099    # 服务端口号
spring.application.name=consul-user # 服务别名,注册到注册中心的名称
spring.cloud.zookeeper.connect-string=127.0.0.1:2181    #服务调用服务Consul注册中心的url地址

1.ZookeeperClient-服务提供者(Provider)在主类上标注@EnableDiscoveryClient注解向注册中心注册服务
2.ZookeeperClient-服务消费者(Consumer)在主类上标注@EnableDiscoveryClient注解从注册中心调用服务
3..在调用服务的方法上标注@LoadBalanced开启Ribbon的负载均衡功能进行服务的调用

DiscoveryClient

@Autowired      // 自动装配
private DiscoveryClient discoveryClient;    // Discovery接口,用于获取注册中心的服务信息

@RequestMapping("/discoveryClientMember")
public List<ServiceInstance> discoveryClientMember(){
    List<ServiceInstance> instances=discoveryClient.getInstance("consul-ticket");
    for(ServiceInstance serviceInstance:instances){
            System.out.println("URI:"+serviceInstance.getUri());
    }
    return instance;
}

作者:攻城狮Chova
链接:https://juejin.cn/post/6957970995843956749
来源:掘金

上一篇 下一篇

猜你喜欢

热点阅读