王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
Eureka 和 Ribbon
/  

Eureka 和 Ribbon

连接到 eureka 的时候需要带上连接的用户名和密码

eureka 服务端改造添加启动器
image.png

代码配置,关闭 csrf 验证
image.png

Application.properties 配置

开启 basic 校验,设置登录用户名密码

security.basic.enabled=true

spring.security.user.name=admin

spring.security.user.password=admin

Eureka 客户端改造

跟 eureka 连接的时候要带上用户名密码

eureka.client.serviceUrl.defaultZone=http://admin:admin@l

ocalhost:8763/eureka/

  1. 服务续约保活

当客户端启动想 eureka 注册了本身服务列表后,需要隔段时间发送一次心跳给 eureka 服务

端来证明自己还活着,当 eureka 收到这个心跳请求后才会知道客户端还活着,才会维护该

客户端的服务列表信息。一旦因为某些原因导致客户端没有按时发送心跳给 eureka 服务端,

这时候 eureka 可能会认为你这个客户端已经挂了,它就有可能把该服务从服务列表中删除

掉。

有关续约保活的配置

客户端配置

#服务续约,心跳的时间间隔

eureka.instance.lease-renewal-interval-in-seconds=30

#如果从前一次发送心跳时间起,90 秒没接受到新的心跳,讲剔除服务

eureka.instance.lease-expiration-duration-in-seconds=90

#表示 eureka client 间隔多久去拉取服务注册信息,默认为 30 秒

eureka.client.registry-fetch-interval-seconds=30服务端配置

#自我保护模式,当出现出现网络分区、eureka 在短时间内丢失过多客户端时,

会进入自我保护模式,即一个服务长时间没有发送心跳,eureka 也不会将其删

除,默认为 true

eureka.server.enable-self-preservation=true

#Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低

于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来

eureka.server.renewal-percent-threshold=0.85

#eureka server 清理无效节点的时间间隔,默认 60000 毫秒,即 60 秒

eureka.server.eviction-interval-timer-in-ms=60000

  1. Eureka 健康检测

Eureka 默认的健康检测只是你校验服务连接是否是 UP 还是 DOWN 的,然后客户端只会调用

状态为 UP 状态的服务,但是有的情况下,虽然服务连接是好的,但是有可能这个服务的某

些接口不是正常的,可能由于需要连接 Redis,mongodb 或者 DB 有问题导致接口调用失败,

所以理论上服务虽然能够正常调用,但是它不是一个健康的服务。所以我们就有必要对这种

情况做自定义健康检测。

Application.properties 配置

开启健康检测

#健康检测

eureka.client.healthcheck.enabled=true

自定义健康检测代码
image.png

我们可以在 health 方法里面去连接数据库,如果连接异常了则返回 DOWN,如果没异常则

方法 UP,这个 health 方法是线程去掉的,隔一段时间掉一次

检测检测依赖的 jar 包
image.png

6、服务下线

比如有些情况是服务主机意外宕机了,也就意味着服务没办法给 eureka 心跳信息了,但是

eureka 在没有接受到心跳的情况下依赖维护该服务 90s,在这 90s 之内可能会有客户端调用

到该服务,这就可能会导致调用失败。所以我们必须要有一个机制能手动的立马把宕机的服

务从 eureka 服务列表中清除掉,避免被服务调用方调用到。

调用服务下线的接口:

这个接口是调用 eureka 服务端的接口

http://localhost:8763/eureka/apps/MICRO-ORDER/localhost:micro-order:8084
image.png

  1. Eureka 高可用

Eureka 热备份的架构图如下:
image.png

整个微服务中存在多个 eureka 服务,每个 eureka 服务都是相互复制的,会把客户端注册进

来的服务复制到 eureka 集群中的其他节点里面来。其实简单来说就是 eureka 每个节点相互

复制。

具体配置如下:
image.png

端口为 8761 的 eureka 服务端把自己注册到 8762 的 eureka 服务端

同样的道理,8762 注册到 8761

image.png

配置存在在两个配置文件中
image.png

启动的时候按照指定配置文件启动

java -jar springcloud-eureka.jar --spring.profiles.active=8761
image.png

image.png

  1. Ribbon API

Ribbon 是一个独立的组件,是用来进行远程接口调用的,代码如下
image.png

通过 getForObject 方法可以掉到用 micro-order 服务的,queryUser 接口。然后在调用期间会

存在负载均衡,micro-order 服务对应有几个服务实例就会根据负载均衡算法选择某一个去

调用。

Get 请求

getForEntity:此方法有三种重载形式,分别为:

getForEntity(String url, Class responseType)

getForEntity(String url, Class responseType, Object... uriVariables)

getForEntity(String url, Class responseType, Map<String, ?> uriVariables)

getForEntity(URI url, Class responseType)

注意:此方法返回的是一个包装对象 ResponseEntity其中 T 为 responseType 传入类型,

想拿到返回类型需要使用这个包装类对象的 getBody()方法

getForObject:此方法也有三种重载形式,这点与 getForEntity 方法相同:

getForObject(String url, Class responseType)

getForObject(String url, Class responseType, Object... uriVariables)

getForObject(String url, Class responseType, Map<String, ?> uriVariables)

getForObject(URI url, Class responseType)

注意:此方法返回的对象类型为 responseType 传入类型

Post 请求

post 请求和 get 请求都有ForEntity 和ForObject 方法,其中参数列表有些不同,除了这两个

方法外,还有一个 postForLocation 方法,其中 postForLocation 以 post 请求提交资源,并返

回新资源的 URI

postForEntity:此方法有三种重载形式,分别为:postForEntity(String url, Object request, Class responseType, Object... uriVariables)

postForEntity(String url, Object request, Class responseType, Map<String, ?> uriVariables)

postForEntity(URI url, Object request, Class responseType)

注意:此方法返回的是一个包装对象 ResponseEntity其中 T 为 responseType 传入类型,

想拿到返回类型需要使用这个包装类对象的 getBody()方法

postForObject:此方法也有三种重载形式,这点与 postForEntity 方法相同:

postForObject(String url, Object request, Class responseType, Object... uriVariables)

postForObject(String url, Object request, Class responseType, Map<String, ?> uriVariables)

postForObject(URI url, Object request, Class responseType)

注意:此方法返回的对象类型为 responseType 传入类型

postForLocation:此方法中同样有三种重载形式,分别为:

postForLocation(String url, Object request, Object... uriVariables)

postForLocation(String url, Object request, Map<String, ?> uriVariables)

postForLocation(URI url, Object request)

注意:此方法返回的是新资源的 URI,相比 getForEntity、getForObject、postForEntity、

postForObject 方法不同的是这个方法中无需指定返回类型,因为返回类型就是 URI,通过

Object... uriVariables、Map<String, ?> uriVariables 进行传参依旧需要占位符,参看 postForEntity

部分代码

  1. 负载均衡算法
    image.png

//线性轮训

new RoundRobinRule();//可以重试的轮训

new RetryRule();

//根据运行情况来计算权重

new WeightedResponseTimeRule();

//过滤掉故障实例,选择请求数最小的实例

new BestAvailableRule();

//随机

new RandomRule();

10、Ribbon 配置

Application.properties 配置

#点对点直连测试配置

#关闭 ribbon 访问注册中心 Eureka Server 发现服务,但是服务依旧会注册。

#true 使用 eureka false 不使用

ribbon.eureka.enabled=true

spring.cloud.loadbalancer.retry.enabled=true

#指定调用的节点

micro-order.ribbon.listOfServers=localhost:8001

#单位 ms ,请求连接超时时间

micro-order.ribbon.ConnectTimeout=1000

#单位 ms ,请求处理的超时时间

micro-order.ribbon.ReadTimeout=2000

micro-order.ribbon.OkToRetryOnAllOperations=true

#切换实例的重试次数

micro-order.ribbon.MaxAutoRetriesNextServer=2

#对当前实例的重试次数 当 Eureka 中可以找到服务,但是服务连不上时将会

重试

micro-order.ribbon.MaxAutoRetries=2micro-order.ribbon.NFLoadBalancerRuleClassName=com.netfli

x.loadbalancer.RandomRule

micro-order.ribbon.NFLoadBalancerPingClassName=com.netfli

x.loadbalancer.PingUrl

代码配置

使用@RibbonClients 加载配置
image.png

这个配置类只针对 micro-order 服务,微服务系统里面有很多服务,这就可以区别化配置。

配置 configuration 配置类的时候,一定要注意,配置类不能陪@ComponentScan 注解扫描到,

如果被扫描到了则该配置类就是所有服务共用的配置了。
image.png
11、Ribbon 单独使用

Ribbon 是一个独立组件,可以脱离 springcloud 使用的
image.png
需要依赖两个 jar

image.png


标题:Eureka 和 Ribbon
作者:wanglei03
地址:https://www.wangleijava.com/articles/2020/07/24/1595573244898.html