1,为什么使用服务注册中心?
当系统的微服务越来越多的时候,那么他们之间的调用关系就越来越复杂,这时候提出了服务注册中心,我理解的,服务注册中心,起初就是规范各个微服务之间的调用
2,什么是服务治理?
Spring Cloud封装了Netflix公司开发的Eureka模块实现服务治理
在传统的rpc调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以服务服务治理,用于管理服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务注册和发现。
3,什么是服务注册与发现?
Eureka 采用了CS(服务器-客户端)设计结构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他服务,使用Eureka的客户端连接到Eureka Server并维持心跳连接,这样系统管理人员就可以通过Eureka Server 来监控系统中各个微服务是否正常运行。
在服务注册与发现中,有一个注册中心,当服务启动的时候,会把当前服务器的信息比如服务器地址等信息以别名的方式注册到注册中心上,另一方(消费者/服务提供者)以该别名的方式去服务器上获取到实际服务器地址,然后再本地实现RPC调用,RPC吊桶的核心设计思想:在于注册中心,因为使用注册中心管理每个服务于服务之间的一个依赖关系(服务治理)。在任何rpc远程调用框架中,都会有一个注册中心(存放服务地址等信息)

4,Eureka
Eureka 目前官网已停止更新。
Eureka 的系统结构如下:

springcloud双注册中心 springcloud服务注册中心eureka_客户端


Eureka 包含两个组 件: Eureka Server 和Eureka Client

为了便于理解,我们将Eureka client再分为Service Provider和Service Consumer。

Eureka Server 提供服务注册和发现
各个微服务节点通过配置启动成功后,会在Eureka Server 中注册,这样Eureka Server 中的服务注册表会存储所有可用服务节点的信息,服务节点信息可以在界面清晰看到

Eureka Client通过注册中心进行访问
是一个java客户端,用户简化Eureka Server 的交互,客户端也具备一个内置的、使用轮训(round-robin)负载算法的负载均衡器,在应用启动后,将会向Eureka Server发送心跳(默认周期30秒),如果Eureka Server 在多个心跳周期没有接收到某个节点的心跳,Eureka Server 将会从服务注册表中将这个服务节点移除(默认90秒)。

5,单机版Eureka的搭建

1),新建工程

springcloud双注册中心 springcloud服务注册中心eureka_eureka_02


2),pom文件中引入依赖包

<!--Eureka server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

3),编写application.yml文件

eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表识不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

4),编写启动类

@SpringBootApplication
@EnableEurekaServer
public class SingleEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(SingleEurekaApplication.class,args);
    }
}

5),项目启动

springcloud双注册中心 springcloud服务注册中心eureka_Server_03


到这里Eureka Server 服务端已经搭建好

6),编写客户端

springcloud双注册中心 springcloud服务注册中心eureka_Server_04


7),编写客户端application.yml文件

eureka:
	instance-id: provider-payment8011 
    prefer-ip-address: true
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
    #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
          defaultZone: http://localhost:7001/eureka #单机版

8),编写客户端的启动类

@SpringBootApplication
@EnableEurekaClient
public class ProviderPaymentApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderPaymentApplication.class,args);
    }
}

9),客户端启动后

springcloud双注册中心 springcloud服务注册中心eureka_Server_05


通过上图可以看到服务已注册到Eureka Server中。6 集群版Eureka搭建

1)搭建多个Eureka server(如eureka7001.com:7001,eureka7002.com:7002) 同 “”5 单机版Eureka搭建 “”中 Eureka server 搭建步骤一样

主要更改每个Eureka server 中application.yml 文件(每个Eureka server 都是相互注册 相互守望如下图所示)

springcloud双注册中心 springcloud服务注册中心eureka_eureka_06

eureka:
  instance:
    hostname: eureka7001.com  #eureka服务端的实例名字 
  client:
    register-with-eureka: false    #表识不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      #集群
      defaultZone: http://eureka7002.com:7002/eureka/

2)把客户端注册中集群中
只需要更改客户端的application.yml 文件

eureka:
	instance-id: provider-payment8011
    prefer-ip-address: true
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版

7 服务提供者搭建成集群

创建多个服务提供者为(provider:8001 provider:8002)
创建消费者80

以上服务创建参考地址:

然后更改80 服务中controller代码

springcloud双注册中心 springcloud服务注册中心eureka_客户端_07


红框中的地址改为:

//provider-payment 为提供者服务名

public static final String PAYMENT_URL = “http://provider-payment”;

再赋予RestTemplate 负载均衡能力

@Configuration
public class RestTemplateConfig {


    @Bean
    @LoadBalanced  //让这个RestTemplate在请求时拥有客户端负载均衡的能力 
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

启动后就可以轮询访问 provider:8001 provider:8002

8 服务的发现Discovery
可以通过代码知道注册中心都注册了哪些服务,并且每个服务有多少个实例

启动类上添加
@EnableDiscoveryClient


具体实现的写法:

类中注入
   @Resource
    private DiscoveryClient discoveryClient;
    
代码实现
//获取有多少个服务
   List<String> services = discoveryClient.getServices();
        services.forEach(System.out::println);

//单独的某个服务有多少个实例
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        instances.forEach(instance -> {
            System.out.println(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
        });

9 Eureka的自我保护

概述:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保护。属于CAP(一致性,可用性,分区容错性)中的AP分支

springcloud双注册中心 springcloud服务注册中心eureka_Server_08


关闭自我保护机制:

在Eureka server 中设置:

#  server:
##    关闭自我保护机制,保证不可用服务被及时踢除(默认是开启的)
#    enable-self-preservation: false
#    eviction-interval-timer-in-ms: 2000

在Eureka client中设置:

instance:
#    Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
#    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
#    lease-expiration-duration-in-seconds: 2

10 Eureka Client不要在SpringBoot启动类上标注@EnableEurekaClient注解也可以向注册中心注册的原因

简而言之就是当我们引用了EurekaClient的依赖后
通过EurekaClientAutoConfiguration 配置类查看知道:
EurekaClient的注册,原来其实是和两个配置项有关的,一个是eureka.client.enabled,另一个是spring.cloud.service-registry.auto-registration.enabled,只不过这两个配置默认都是true。