SpringCloud-服务注册中心

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,目前没找到好的解决办法,日后在解决。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值