spring cloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置
- spring cloud
- 时间:2020-06-03 10:18
- 6683人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
spring cloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置
本文主要内容:
1:payment8002创建及测试
2:order服务访问payment的时候实现负载均衡
3:再次来理解服务的注册与发现
4:总结
本文是由凯哥(凯哥Java:kagejava)发布的《spring cloud系列》教程的总第七篇:《spring cloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置》。
本文是几个维度中的第一个维度:注册与发现维度配置中心管理之Eureka相关教程第四篇。
一:创建cloud-provider-payment8002
1.1:创建步骤:
二:启动测试
我们可以看到CLOUD-PAYMENT-SERVICE是有两台机器。分别是8001和8002
2.2:再来分别访问8001和8002的服务:
我们可以看到把对应服务的端口号返回到页面上了。
我们在使用消费者order80测试试试:
我们发现无论我们怎么刷新访问的端口都是8001.但是,我们payment确实启动了两个项目8001和8002啊。那么为什么呢?
查看oderController,我们可以看到访问服务的连接是写死的。既然后面启动了两个服务,我想要既可以访问8001的端口也要访问8002的端口,那么怎么做呢?
注:这部分代码对应git的tag是:v0.1.0-v20200504
二:负载均衡配置
这里,如果我们修改成服务名称呢?那么服务名称是什么?服务名称就是我们在eureka集群注册的application列表下的名称。
那么我们直接把CLOUD-PAYMENT-SERVICE这个服务名字复制到PAYMENT_URL中可以吗?
重启完成之后,我们重新访问:
重新访问的时候,我们看到提示信息是说:java.net.UnknownHostException: CLOUD-PAYMENT-SERVICE。没有找到这个host异常。
为什么呢?我们知道,这个服务是注册到eureka的服务的别名,而不是真实存在的。如果要想访问到,这里就需要使用到负载均衡了。
怎么修改呢?需要修改RestTemplate的配置类中添加@LoadBalanced注解赋予RestTemplate负载均衡的能力。
修改如下:
在order80项目中,ApplicationContextConfig类里面getRestTemplate方法上面添加@LoadBalance注解即可。如下图:
修改完成之后,再次访问页面,然后刷新页面,我们可以看到端口是8001和8002来回切换的。这种模式的结构如下图:
小坑记录:
在写死的时候,凯哥把URL后面添加了payment这个是controller的访问名。但是在修改成服务别名的时候,忘了修改下面代码引用,导致访问失败了。然后修改后可以了。如下图:
写代码还是要认真仔细对待。不然,自己都不知道会给自己挖多少坑。
注:这部分代码对应git的tag是:v0.1.1-20200504
三:再次来理解服务的注册与发现
在前面文章中《spring cloud系列教程第四篇-Eureka基础知识》我们讲解了服务的注册与发现:
从上图中我们看到服务启动的时候,会把自己的信息以别名的形式注册到注册中心上,消费者同样以别名方式去注册中心获取实际的服务通讯地址,然后RPC调用。这句话刚看到的时候不是很理解吧。现在我们再来理解理解:
3.1:服务启动的时候,会把当前自己服务信息以别名的形式注册到注册中心是什么意思呢?
我们来看看Eureka注册中心的服务生产提供者:payment的两个服务在注册中心什么样子.如下图:
当前服务集群的信息:服务IP(localhost):服务名称(cloud-payment-service):服务端口(8001)
这三个维度组成了一个别名形式,注册在了注册中心上。
我们在来看看消费者order80服务是怎么消费的:
在消费者使用的同样是服务的别名的。
关系如下图:
这样来看,是不是更容易理解服务的注册与发现了?
四:总结
1:生产者多个服务,都需要注册到eureka注册中心
2:在消费者使用eureka的服务别名进行访问
3:需要修改restTemplate,使用@LoadBalanced注解赋予RestTemplate负载均衡的能力(默认使用的负载策略是轮询策略。一次A一次B的这样轮询的来的)
提前说下:负载使用的就是我们后面将会讲到的Ribbon的负载均衡功能。