服务注册中心

在微服务架构中,注册中心是最基础的核心功能之一,微服务集群一多,管理就麻烦,这时候注册中心就出场了,管理服务和服务之间的依赖关系,还可以实现服务调用,负载均衡,容错等,实现服务发现与注册。

consul 微服务注册中心 微服务 服务注册中心_ribbon


consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_02

一.Eureka

包含两个组件: Eureka服务端(提供服务注册服务)和Eureka客户端(通过注册中心进行访问)。

单机 Eureka构建:

1.导入依赖:

consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_03


2.主启动类:

consul 微服务注册中心 微服务 服务注册中心_zookeeper_04


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

客户端的话包括生产者和消费者:

导入依赖:

consul 微服务注册中心 微服务 服务注册中心_ribbon_05


主启动类:

consul 微服务注册中心 微服务 服务注册中心_zookeeper_06


生产者注册进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 就可以实现负载均衡。

consul 微服务注册中心 微服务 服务注册中心_java_07


Eureka还有一个保护机制,就是当一个服务宕机时,并不会马上将这个服务剔除,而是等一段时间。

服务发现是用于获取注册进注册中心服务的信息的。

使用:

主启动类:

consul 微服务注册中心 微服务 服务注册中心_分布式_08


在Controller中注入:

consul 微服务注册中心 微服务 服务注册中心_ribbon_09


使用:

@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:

consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_10


消费者注册进Zookeeper:

consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_11


导入依赖:

<!-- 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>

生产者配置文件:

consul 微服务注册中心 微服务 服务注册中心_zookeeper_12


消费者配置文件:

consul 微服务注册中心 微服务 服务注册中心_java_13


三个注册中心的异同点:

consul 微服务注册中心 微服务 服务注册中心_java_14


AP的Eureka有时候不是那么在乎数据的一致,在乎的是系统的可用性,而CP的Consul和Zookeeper一旦一个服务宕机,就会停止给消费者提供服务,保证数据的一致性。

二.负载均衡(Ribbon)

当导入了Eureka客户端的依赖时,就有了Ribbon的负载均衡。

默认是轮询(就是一个个的使用),

还有这么多负载均衡的规则:

consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_15

当我们想换一个负载均衡的规则时,可以自己配置,注意配置所在的包不能在Compantscan扫描的地方。例如:

consul 微服务注册中心 微服务 服务注册中心_consul 微服务注册中心_16


consul 微服务注册中心 微服务 服务注册中心_分布式_17


主启动类上:

consul 微服务注册中心 微服务 服务注册中心_java_18

负载均衡的算法就是:

Rest接口请求的次数%服务器集群总数量=实际调用服务器的下标,每次重启服务请求都会从 1 开始。

consul 微服务注册中心 微服务 服务注册中心_zookeeper_19