Spring Cloud之服务注册和负载均衡

目录

1. 服务注册Eureka基础

1.1 微服务的注册中心

1.2 注册中心的主要作用

1.3 常见的注册中心

2.  Eureka的概述

3. 搭建Eureka注册中心

3.1 eurekaService

3.1.1引入maven坐标

 3.1.2 配置application.yml

 3.1.3 启动eurekaService

3.2 服务注册到Eureka注册中心

3.2.1 引入maven坐标

 3.2.2 配置application.yml

3.2.3 启动服务提供者

3.3向注册中心获取数据

3.3.1 引入maven坐标

3.3.2 配置application.yml

3.3.3 启动服务使用者

3.3.4 调用接口、获取数据

4. 负载均衡(Ribbon)

4.1 服务消费者(启动类改造)

4.2 负载均衡策略 

4.3 什么是负载均衡

4.4 Ribbon中的关键组件

 5. Eureka Server 高可用集群

5.1 搭建 Eureka Server高可用集群

5.2服务注册到Eureka Server集群

6. Eureka替换方案Consul

6.1 consul与Eureka的区别

6.2 consul的下载与安装

6.3 引入maven坐标(服务提供者and消费者)

6.4 配置application.yml(服务提供者and消费者)

6.5 consul高可用集群 

6.6 安装consul并启动

6.6.1  在每个consul节点上安装consul服务,下载安装过程和单节点一致。

6.6.2  启动每个consul server节点

6.6.3 开启client服务式启动consul

6.6.4 每个节点加入集群(构造consul集群联系)

6.6.5 测试

6.7 Consul 常见问题


1. 服务注册Eureka基础

        1.1 微服务的注册中心

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中, 服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。 

Spring Cloud之服务注册和负载均衡_第1张图片

         1.2 注册中心的主要作用

 注册中心一般包含如下几个功能:

 1. 服务发现:

        (1)、服务注册/反注册:保存服务提供者和服务调用者的信息 。(2)、服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能。 (3)、服务路由(可选):具有筛选整合服务提供者的能力。

2. 服务配置:

        (1)、配置订阅:服务提供者和服务调用者订阅微服务相关的配置 。(2)、配置下发:主动将配置推送给服务提供者和服务调用者。

3. 服务健康检测:

        (1)、检测服务提供者的健康情况。

         1.3 常见的注册中心

通过一张表格大致了解Eureka、Consul、Zookeeper的异同点。选择什么类型的服务注册与 发现组件可以根据自身项目要求决定。

Spring Cloud之服务注册和负载均衡_第2张图片

2.  Eureka的概述

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中, 实现SpringCloud的服务发现功能。

Spring Cloud之服务注册和负载均衡_第3张图片

上图简要描述了Eureka的基本架构,由3个角色组成:

1、Eureka Server

        (1)、提供服务注册和发现

2、Service Provider

        (1)、服务提供方

        (2)、将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer

        (1)、服务消费方

         (2)、从Eureka获取注册服务列表,从而能够消费服务

3. 搭建Eureka注册中心

        3.1 eurekaService

                3.1.1引入maven坐标


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server

                3.1.2 配置application.yml

#项目名称
spring:
  application:
    name: eureka-service
#该注册表的端口
server:
  port: 9000
#主机的名称
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false #是否将自己注册到注册中心
    fetchRegistry: false  #是否从eureka中获取注册信息
    serviceUrl:  #向默默端口注册自己
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 可以进行多个路径:用逗号隔开
  server:
    enable-self-preservation: false  #关闭自我保护  --开发阶段使用
    eviction-interval-timer-in-ms: 4000 #剔除时间间隔,单位:毫秒   --开发阶段使用

补充(Eureka中的自我保护):Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况 (在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)

 关闭自我保护

eureka:
  server:
    enable-self-preservation: false  #关闭自我保护  --开发阶段使用
    eviction-interval-timer-in-ms: 4000 #剔除时间间隔,单位:毫秒   --开发阶段使用

                 3.1.3 启动eurekaService

@SpringBootApplication
@EnableEurekaServer  //激活eurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

         3.2 服务注册到Eureka注册中心

                3.2.1 引入maven坐标


    
        org.springframework.cloud
        spring-cloud-commons
    
    
    
        org.springframework.cloud
        spring-cloud-starter-netflix-eureka-client
    

                 3.2.2 配置application.yml

eureka:
 client:
   serviceUrl: # eureka server的路径
     defaultZone: http://localhost:8761/eureka/   # 可以进行多个路径的访问:用逗号隔开
 instance:
   prefer-ip-address: true # 使用ip注册--注册中心存储返回数据 如:192.187.0.0:9001

监控页面显示ip

eureka:
  instance:
    instance-id: ${spring.cloud.client.ip-address}:${server.port}  #向注册中心注册服务ID

补充(Eureka中的自我保护):微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知 Eureka Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。

Eureka Client: 配置开启健康检查,并设置续约时间

eureka:
 client:
   healthcheck: true #开启健康检查(依赖spring-boot-actuator)
  instance:
    preferIpAddress: true
    lease-expiration-duration-in-seconds: 10 #eureka client发送心跳给server端后,续约到期时间(默认90秒)
    lease-renewal-interval-in-seconds: 5 #发送心跳续约间隔

                3.2.3 启动服务提供者

@SpringBootApplication
@EntityScan("product.entity")
//激活eurekaClient  @EnableEurekaClient  or @EnableDiscoveryClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class,args);
    }
}

        3.3向注册中心获取数据

                        3.3.1 引入maven坐标


      org.springframework.cloud
      spring-cloud-starter-netflix-eureka-client


      org.springframework.retry
      spring-retry

                        3.3.2 配置application.yml

eureka:
  client:
    registerWithEureka: false #是否将自己注册到注册中心
    serviceUrl: # eureka server的路径
      defaultZone: http://localhost:9000/eureka/  # 可以进行多个路径的访问:用逗号隔开
  #instance:
    #prefer-ip-address: true #使用ip注册
    #instance-id: ${spring.cloud.client.ip-address}:${server.port}  #向注册中心注册服务ID

                  3.3.3 启动服务使用者

@SpringBootApplication
@EntityScan("order.entity")
public class OrderApplication {
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
}

                3.3.4 调用接口、获取数据

   @Autowired
   private RestTemplate restTemplate;
    /**
	 * 基于ribbon的形式调用远程微服务
	 *  1.使声明RestTemplate
	 *  2.使用服务名称替换ip地址
	 */
	@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
	public Product findById(@PathVariable Long id) {
		Product product = null;
        //product = restTemplate.getForObject("http://192.168.0.1:9001/product/"+id,Product.class);
		product = restTemplate.getForObject("http://service-product/product/"+id,Product.class);
		return product;
	}

4. 负载均衡(Ribbon)

是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中, Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读 取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。

 Spring Cloud之服务注册和负载均衡_第4张图片

 作用:

        1.服务调用 :基于Ribbon实现服务调用, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进行调用

        2.负载均衡 :当有多个服务提供者时,Ribbon可以根据负载均衡的算法自动的选择需要调用的服务地址

        4.1 服务消费者(启动类改造)

/**
* 基于Ribbon的服务调用与负载均衡
*/
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

        4.2 负载均衡策略 

com.netflix.loadbalancer.RoundRobinRule :以轮询的方式进行负载均衡 (默认)

com.netflix.loadbalancer.RandomRule :随机策略

com.netflix.loadbalancer.RetryRule :重试策略。

com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权 重,越高的被调用的可能性越大。

com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉 故障实例,并返回请求数最小的实例返回。

com.netflix.loadbalancer.AvailabilityFilteringRule :可用过滤策略。过滤掉故障和请 求数超过阈值的服务实例,再从剩下的实力中轮询调用。

在服务消费者的application.yml配置文件中修改负载均衡策略

##需要调用的微服务名称
service-product:
 ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

        4.3 什么是负载均衡

在搭建网站时,如果单节点的 web服务性能和可靠性都无法达到要求;或者是在使用外网服务时,经常 担心被人攻破,一不小心就会有打开外网端口的情况,通常这个时候加入负载均衡就能有效解决服务问 题。 负载均衡是一种基础的网络服务,其原理是通过运行在前面的负载均衡服务,按照指定的负载均衡算 法,将流量分配到后端服务集群上,从而为系统提供并行扩展的能力。 负载均衡的应用场景包括流量包、转发规则以及后端服务,由于该服务有内外网个例、健康检查等功 能,能够有效提供系统的安全性和可用性。

Spring Cloud之服务注册和负载均衡_第5张图片

        4.4 Ribbon中的关键组件

ServerList:可以响应客户端的特定服务的服务器列表。

ServerListFilter:可以动态获得的具有所需特征的候选服务器列表的过滤器。

ServerListUpdater:用于执行动态服务器列表更新。

Rule:负载均衡策略,用于确定从服务器列表返回哪个服务器。

Ping:客户端用于快速检查服务器当时是否处于活动状态。

LoadBalancer:负载均衡器,负责负载均衡调度的管理。 

Spring Cloud之服务注册和负载均衡_第6张图片

 5. Eureka Server 高可用集群

如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Server中的缓存若不被刷新,就可能会影 响到微服务的调用,甚至影响到整个应用系统的高可用。因此,在生成环境中,通常会部署一个高可用 的Eureka Server集群。

Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增 量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server的默认行 为。

Spring Cloud之服务注册和负载均衡_第7张图片

         5.1 搭建 Eureka Server高可用集群

#项目名称
spring:
  application:
    name: eureka-service
#该注册表的端口
server:
  port: 9000
  client:
    serviceUrl:  #向默默端口注册自己
      defaultZone: http://192.168.11.2:8000/eureka/
#项目名称
spring:
  application:
    name: eureka-service
#该注册表的端口
server:
  port: 8000
  client:
    serviceUrl:  #向默默端口注册自己
      defaultZone: http://192.168.11.2:9000/eureka/

        5.2服务注册到Eureka Server集群

如果需要将微服务注册到Eureka Server集群只需要修改yml配置文件即可

eureka:
 client:
   serviceUrl:
     defaultZone: http://192.168.11.2:9000/eureka/,http://192.168.11.2:8000/eureka/

6. Eureka替换方案Consul

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实 现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如ZooKeeper 等)。 使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和 Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。

 特性:

        服务发现

        健康检查

        Key/Value 存储

        多数据中心

        6.1 consul与Eureka的区别

(1)一致性

        Consul强一致性(CP) 服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认 为注册成功 Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。 Eureka保证高可用和最终一致性(AP) 服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否 replicate成功 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提 供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺 牲了一致性。

(2)开发语言和使用

        eureka就是个servlet程序,跑在servlet容器中 Consul则是go编写而成,安装启动即可

        6.2 consul的下载与安装

Consul 不同于 Eureka 需要单独安装,访问Consul 官网下载 Consul 的最新版本,我这里是 consul1.5x。根据不同的系统类型选择不同的安装包,从下图也可以看出 Consul 支持所有主流系统。 

Spring Cloud之服务注册和负载均衡_第8张图片

        6.3 引入maven坐标(服务提供者and消费者)

 

     org.springframework.cloud
     spring-cloud-starter-consul-discovery

 

     org.springframework.boot
     spring-boot-starter-actuator

        6.4 配置application.yml(服务提供者and消费者)

spring:
  application:
    name: service-consul   # 微服务名称
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=FALSE&serverTimezone=GMT%2B8
    username: root
    password: QZ7456.521
  jpa:
    database: MySQL
    show-sql: true
    open-in-view: true
 cloud:
   consul: #consul相关配置
   host: 192.168.74.101 #ConsulServer请求地址
     port: 8500 #ConsulServer端口
     discovery:
        #是否注册
       register: true
        #实例ID
       instance-id: ${spring.application.name}-1
        #服务实例名称
       service-name: ${spring.application.name}
        #服务实例端口
       port: ${server.port}
        #健康检查路径
       healthCheckPath: /actuator/health
        #健康检查时间间隔
       healthCheckInterval: 15s
        #开启ip地址注册
       prefer-ip-address: true
        #实例的请求ip
       ip-address: ${spring.cloud.client.ip-address}

 启动成功之后访问: http://IP:8500 ,可以看到 Consul 的管理界面

Spring Cloud之服务注册和负载均衡_第9张图片

        6.5 consul高可用集群 

 Spring Cloud之服务注册和负载均衡_第10张图片

agent:启动一个consul的守护进程

dev:开发者模式

client:是consul代理,和consul server交互,一个微服务对应一个client,微服务和client部署到一台机器上

server:真正干活的consul服务3-5个

Gossip:流言协议
        所有的consul都会参与到gossip协议中(多节点中数据赋值)

 Raft协议:
        保证server集群的数据一致

Spring Cloud之服务注册和负载均衡_第11张图片

Leader:是server集群中唯一处理可以端请求的

Follower:选民,被动接收数据

候选人:可以被选举为leader

        6.6 安装consul并启动

                6.6.1  在每个consul节点上安装consul服务,下载安装过程和单节点一致。

##从官网下载最新版本的Consul服务
wget https://releases.hashicorp.com/consul/1.5.3/consul_1.5.3_linux_amd64.zip
##使用unzip命令解压
unzip consul_1.5.3_linux_amd64.zip
##将解压好的consul可执行命令拷贝到/usr/local/bin目录下
cp consul /usr/local/bin
##测试一下
consul

                6.6.2  启动每个consul server节点

##登录s1虚拟机,以server形式运行
consul agent -server -bootstrap-expect 3 -data-dir /etc/consul.d -node=server-1 
-bind=192.168.74.101 -ui -client 0.0.0.0 &
##登录s2 虚拟机,以server形式运行
consul agent -server -bootstrap-expect 2 -data-dir /etc/consul.d -node=server-2 
-bind=192.168.74.102 -ui -client 0.0.0.0 & 
##登录s3 虚拟机,以server形式运行
consul agent -server -bootstrap-expect 2 -data-dir /etc/consul.d -node=server-3 
-bind=192.168.74.103 -ui -client 0.0.0.0 &

-server: 以server身份启动。

-bootstrap-expect:集群要求的最少server数量,当低于这个数量,集群即失效。

-data-dir:data存放的目录,更多信息请参阅consul数据同步机制

-node:节点id,在同一集群不能重复。

-bind:监听的ip地址。

-client:客户端的ip地址(0.0.0.0表示不限制)

& :在后台运行,此为linux脚本语法

                6.6.3 开启client服务式启动consul

##在本地电脑中使用client形式启动consul
consul agent -client=0.0.0.0  -data-dir /etc/consul.d -node=client-1 -bind=192.168.2.1

                 6.6.4 每个节点加入集群(构造consul集群联系)

设置一个Leader接收数据(在s2,s3,s4 服务其上通过consul join 命令加入 s1中的consul集群中)

##加入consul集群
consul join 192.168.74.101

                6.6.5 测试

在任意一台服务器中输入 consul members查看集群中的所有节点信息

##查看consul集群节点信息
consul members

 Spring Cloud之服务注册和负载均衡_第12张图片

         6.7 Consul 常见问题

 (1)节点和服务注销

        当服务或者节点失效,Consul不会对注册的信息进行剔除处理,仅仅标记已状态进行标记(并且不可使用)。如果担心失效节点和失效服务过多影响监控。可以通过调用HTTP API的形式进行处理节点和服务的注销可以使用HTTP API:

  • 注销任意节点和服务:/catalog/deregister
  • 注销当前节点的服务:/agent/service/deregister/:service_id

如果某个节点不继续使用了,也可以在本机使用consul leave命令,或者在其它节点使用consul force-leave 节点Id。

(2)健康检查与故障转移

        在集群环境下,健康检查是由服务注册到的Agent来处理的,那么如果这个Agent挂掉了,那么此节点 的健康检查就处于无人管理的状态。从实际应用看,节点上的服务可能既要被发现,又要发现别的服务,如果节点挂掉了,仅提供被发现的 功能实际上服务还是不可用的。当然发现别的服务也可以不使用本机节点,可以通过访问一个Nginx实 现的若干Consul节点的负载均衡来实现。

7. 注册中心总结 

(1)Eureka

        搭建注册中心

                        引入依赖 spring-cloud-starter-netflix-eureka-server

                        配置EurekaServer

                        通过 @EnableEurekaServer 激活Eureka Server端配置

        服务注册

                服务提供者引入 spring-cloud-starter-netflix-eureka-client 依赖

                通过 eureka.client.serviceUrl.defaultZone 配置注册中心地址 

(2)consul

        搭建注册中心

                下载安装consul

                启动consul consul agent -dev

        服务注册

                服务提供者引入spring-cloud-starter-consul-discovery依赖

                通过spring.cloud.consul.host spring.cloud.consul.port指定Consul Server的请求地址 

 上一页             下一页

你可能感兴趣的:(Spring,Cloud,spring,cloud,eureka,负载均衡)