spring cloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置

  • 作者: 凯哥Java
  • spring cloud
  • 时间:2020-06-03 10:18
  • 214人已阅读
简介 springcloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置本文主要内容:1:payment8002创建及测试2:order服务访问payment的时候实现负载均衡3:再次来理解服务的注册与发现4:总结本文是由凯哥(凯哥Java:kagejava)发布的《springcloud系列》教程的总第七篇:《springcloud系列教程第七篇-服务提供者集群环境搭建及负载均衡配置》。本文是

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的负载均衡功能。


Top Top