Eureka管理服务高可用

参考文章
文章1
文章2
文章3
文章4
前几天学了微服务高可用,但是一直没有练,今天练习发现以下问题:
1.服务注册后,如果想通过服务名称调用微服务,必须使用另一个消费者服务通过负载均衡来调用,不知道为什么,这是困扰我一晚上练习的最大症结。
如果直接在地址栏输入“url”的内容,是调不到的
在这里插入图片描述
2.负载均衡的问题,这个RestTemplate的负载均衡是和Ribbon来一起配合使用的,所以pom依赖里面会有ribbon依赖存在

<dependencies>
	<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
	</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
	</dependency>
</dependencies>

如果注释掉ribbon依赖,也会有负载均衡的效果,不过用的策略是availabilityFilteringRule,粗略从日志中看到的
在这里插入图片描述
在这里插入图片描述
如果不注释ribbon依赖,老师讲用的是ZoneAvoidanceRule策略
附:ribbon负载均衡策略

策略名策略描述实现说明
BestAvailableRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped(失效状态)了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRule根据相应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择server。
RetryRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server
RandomRule随机选择一个server在index上随机,选择index对应位置的server
ZoneAvoidanceRule复合判断server所在区域的性能和server的可用性选择server使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

4.结合网上的其他教程,可以做到负载均衡
首先实现相同服务名的服务,如:Travel
在这里插入图片描述
其次消费者服务Spring容器加上 RestTemplate,消费者客户端调用RestTemplate的方法实现调用服务及负载均衡
在这里插入图片描述
在这里插入图片描述
最后实现负载均衡
在这里插入图片描述
在这里插入图片描述
2020年4月2日
补充几点错误 和 细节:
1.当写eureka注册中心时,必须将fetch-registry和register-with-eureka设置为false,否则报错,暂时记录不去管它
在这里插入图片描述
在这里插入图片描述
2.关于以下这几个配置的区别(之前说过这三个配置配置后都可以实现服务名的注册是有问题的):原文链接
eureka.instance.hostname
eureka.instance.appname
spring.application.name
在这里插入图片描述
eureka.instance.hostname这个是在配置Eureka注册中心时会使用到,它可以规定localhost、域名或者ip地址,客户端不需要这个,他指定的hostname自然不会被当做服务名
eureka.instance.appname可以用于指定服务名,但是指定的服务名不能被当做服务调用服务,会报No instances available for XXX错误
spring.application.name这个最好用,可以指定服务名且服务名可以调用服务
3.讲一下这个请求参数问题
在这里插入图片描述
如果不加@RequestBody的话是get请求,网址加参数即可请求
如果加了@RequestBody的话是post请求,得用服务或者ApiPost发json参数请求
经过试验:这个无论以何种方式传入参数,只是方式问题,传入的参数都是一样的。
4.在服务调用的时候,getForObject方法请求方式很get
在这里插入图片描述
postForObject方法请求就很post
在这里插入图片描述
无论postObject请求带过去的是什么类型的json,要保证接收方的也要用json接收,保证同为rest风格
此处有一个注意点:
在这里插入图片描述
参看以上代码,用get方式传入参数,用post方式再传参会出现中文乱码问题,所以微服务传参要用post的话就都用rest风格,防止乱码问题,或者处理乱码,这不是这里的重点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值