连接到 eureka 的时候需要带上连接的用户名和密码
eureka 服务端改造添加启动器
代码配置,关闭 csrf 验证
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/
当客户端启动想 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
Eureka 默认的健康检测只是你校验服务连接是否是 UP 还是 DOWN 的,然后客户端只会调用
状态为 UP 状态的服务,但是有的情况下,虽然服务连接是好的,但是有可能这个服务的某
些接口不是正常的,可能由于需要连接 Redis,mongodb 或者 DB 有问题导致接口调用失败,
所以理论上服务虽然能够正常调用,但是它不是一个健康的服务。所以我们就有必要对这种
情况做自定义健康检测。
Application.properties 配置
开启健康检测
#健康检测
eureka.client.healthcheck.enabled=true
自定义健康检测代码
我们可以在 health 方法里面去连接数据库,如果连接异常了则返回 DOWN,如果没异常则
方法 UP,这个 health 方法是线程去掉的,隔一段时间掉一次
检测检测依赖的 jar 包
6、服务下线
比如有些情况是服务主机意外宕机了,也就意味着服务没办法给 eureka 心跳信息了,但是
eureka 在没有接受到心跳的情况下依赖维护该服务 90s,在这 90s 之内可能会有客户端调用
到该服务,这就可能会导致调用失败。所以我们必须要有一个机制能手动的立马把宕机的服
务从 eureka 服务列表中清除掉,避免被服务调用方调用到。
调用服务下线的接口:
这个接口是调用 eureka 服务端的接口
http://localhost:8763/eureka/apps/MICRO-ORDER/localhost:micro-order:8084
Eureka 热备份的架构图如下:
整个微服务中存在多个 eureka 服务,每个 eureka 服务都是相互复制的,会把客户端注册进
来的服务复制到 eureka 集群中的其他节点里面来。其实简单来说就是 eureka 每个节点相互
复制。
具体配置如下:
端口为 8761 的 eureka 服务端把自己注册到 8762 的 eureka 服务端
同样的道理,8762 注册到 8761
配置存在在两个配置文件中
启动的时候按照指定配置文件启动
java -jar springcloud-eureka.jar --spring.profiles.active=8761
Ribbon 是一个独立的组件,是用来进行远程接口调用的,代码如下
通过 getForObject 方法可以掉到用 micro-order 服务的,queryUser 接口。然后在调用期间会
存在负载均衡,micro-order 服务对应有几个服务实例就会根据负载均衡算法选择某一个去
调用。
Get 请求
getForEntity:此方法有三种重载形式,分别为:
getForEntity(String url, Class
getForEntity(String url, Class
getForEntity(String url, Class
getForEntity(URI url, Class
注意:此方法返回的是一个包装对象 ResponseEntity
想拿到返回类型需要使用这个包装类对象的 getBody()方法
getForObject:此方法也有三种重载形式,这点与 getForEntity 方法相同:
getForObject(String url, Class
getForObject(String url, Class
getForObject(String url, Class
getForObject(URI url, Class
注意:此方法返回的对象类型为 responseType 传入类型
Post 请求
post 请求和 get 请求都有ForEntity 和ForObject 方法,其中参数列表有些不同,除了这两个
方法外,还有一个 postForLocation 方法,其中 postForLocation 以 post 请求提交资源,并返
回新资源的 URI
postForEntity:此方法有三种重载形式,分别为:postForEntity(String url, Object request, Class
postForEntity(String url, Object request, Class
postForEntity(URI url, Object request, Class
注意:此方法返回的是一个包装对象 ResponseEntity
想拿到返回类型需要使用这个包装类对象的 getBody()方法
postForObject:此方法也有三种重载形式,这点与 postForEntity 方法相同:
postForObject(String url, Object request, Class
postForObject(String url, Object request, Class
postForObject(URI url, Object request, Class
注意:此方法返回的对象类型为 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
部分代码
//线性轮训
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 加载配置
这个配置类只针对 micro-order 服务,微服务系统里面有很多服务,这就可以区别化配置。
配置 configuration 配置类的时候,一定要注意,配置类不能陪@ComponentScan 注解扫描到,
如果被扫描到了则该配置类就是所有服务共用的配置了。
11、Ribbon 单独使用
Ribbon 是一个独立组件,可以脱离 springcloud 使用的
需要依赖两个 jar