了解服务器端负载均衡和客户端负载均衡的区别可阅读: https://blog.csdn.net/u011136197/article/details/88720157
这里使用客户端负载均衡,更适合微服务
1.原理很简单
- gateway和serviceA都在nacos注册中心注册,gateway从注册中心发现serviceA提供的2个服务(只要愿意,可以启动N个serviceA服务),自动采用轮询机制访问serviceA。
- nacos是spring cloud alibaba的组件,spring cloud alibaba属于spring cloud的子项目。所以spring cloud alibaba的组件可以和spring cloud组件之间可以很好结合
- spring cloud gateway是spring cloud中实现服务网关的功能
请仔细阅读组件版本关系(版本要一致,避免有冲突):https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E。spring cloud都是依赖spring boot的,根据spring boot版本选择spring cloud和spring cloud alibaba,cloud内的组件无需很关心,他们会根据cloud版本自动选择对应的组件版本,此处采用spring boot 2.3.2.RELEASE,spring cloud alibaba 2.2.4.RELEASE进行调试
2.启动服务serverA:
- 首先下载springboot(Dependencies中选择Spring Web ):https://start.spring.io/
- 用idea打开,配置端口8081,启动服务。
- 打开idea的Allow parallel run,重新配置端口号8082,可以启动第二个服务,以此类推可以启动N个服务
3.安装并启动nacos:
- nacos有两个主要功能:实现配置的动态变更、服务注册与发现。我们这里只需要服务注册与发现
- 安装启动(必须):https://nacos.io/zh-cn/docs/quick-start.html ,请参考文档自行安装启动,这里不再具体说明。启动成功后访问
http://127.0.0.1:8848/nacos/index.html
就可以打开nacos的web控制台了 - spring cloud alibaba接入说明(参考):https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
- nacos的注册发现接入说明(参考):https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme-zh.md
4.serverA接入nacos的discovery功能
三步:1.加依赖(pom.xml)、2.改配置(application.yml)、3.加注解(java类或者方法之上)
- 接入spring cloud alibaba ,在pom.xml依赖加载
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 加载nacos discovery依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 添加配置application.yml
server:
port: 8081
spring:
application:
name: serviceA
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
- 开启@EnableDiscoveryClient注解
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
-
以上就好了,打开nacos的web控制台,左侧列表服务管理->服务列表,已经可以看到服务名为demo的的实例数为1了,更改端口,再启动一个serviceA,实例数会变成2。
-
另外可以添加一个Controller测试下,这两个实例是否都可访问
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/demo")
public class DemoController {
@GetMapping("/demo")
public String test(){
System.out.println("demo日志");
return "demo";
}
}
- 此时可以还没有统一访问入口,接下来配置网关
5.通过spring cloud gateway网关访问serviceA
- 下载:打开https://start.spring.io/(Dependencies中选择Gateway)
- 三步:1.加依赖(pom.xml)、2.改配置(application.yml)、3.加注解(这里不需要注解)
- 更改pom.xml,打开后发现spring-cloud-dependencies已经被加载了(请仔细阅读上文组件版本关系)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 在下边加载spring-cloud-alibaba-dependencies依赖(请仔细阅读上文组件版本关系)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 添加配置application.yml
server:
port: 8040
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true
- 打开nacos的web控制台,左侧列表服务管理->服务列表,已经可以看到服务名为gateway的实例数为1了。
- 访问127.0.0.1:8040/serviceA/demo/demo,就访问到serviceA了。查看idea控制台,发现2个serviceA的服务被轮询访问
总结:
- 如何启动serviceB,进行负载访问?原理一致,自行实现即可
- 之所以nacos-discovery可以实现轮询负载,主要是在nacos依赖中依赖了ribbon,如果想自己实现负载算法,可参考ribbon配置方法。
- serviceB和serviceA之间如何互相访问,可以参考Feign
- 服务容错可以参考Sentinel