前文Springboot 实践(1)至Springboot 实践(18),我们分别讲解了springboot数据源配置、swagger-ui测试controller、整合security、整合Oauth2.0、服务注册、路由配置以及配置中心等单例功能开发,实现了各个系统之间的接口访问;在实际项目运用中,是如何解决在线用过大、负载过重问题呢?此文中我们引入负载均衡的概念,负载的轮询调用。
首先我们开启consul服务注册服务端,然后利用MyEclipse2019建立两个工程,分别命名为Springboot-LoadBalance-producer1、Springboot-LoadBalance-producer2、两个工程配置相同的spring.application.name=mango-producer,同时,consul注册使用cld:
Consul.discovery.serviceName: ${spring.application.name}名称。
一、创建Springboot-LoadBalance-producer1项目
1、pom.xml文件,添加jar包
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!--spring-boot-admin-->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.0.4</version>
</dependency>
<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2、application.yml配置
配置端口使用8003,应用名称为mango-producer
server:
port: 8003
spring:
application:
name: mango-producer
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${spring.application.name} # 注册到consul的服务名称
boot:
admin:
client:
url: "http://localhost:8000"
# 开放健康检查接口
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
3、添加启动函数
@EnableDiscoveryClient
@SpringBootApplication
public class MangoProducerApplication {
public static void main(String[] args) {
SpringApplication.run(MangoProducerApplication.class, args);
}
}
4、添加controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello Mango !";
}
}
5、启动项目,观察consul用户界面,如下图所示;此时mango-producer应用只有一个实例即“1 instance”。
二、创建Springboot-LoadBalance-producer2项目
拷贝Springboot-LoadBalance-producer1项目,项目名称依旧使用“mango-producer”,项目端口号改为“8004”,controller改成 return “hello Mango2”,启动项目,观察consul用户界面,如下图所示:此时mango-producer应用只有liangge个实例即“2 instance”。
三、创建消费者工程,命名为Springboot-LoadBalance-consumer项目
拷贝Springboot-LoadBalance-producer1项目,项目名称改为“mango-consumer”,项目端口号改为“8005”,添加controller如下:
@RestController
public class ServiceController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 获取所有服务
*/
@RequestMapping("/services")
public Object services() {
return discoveryClient.getInstances("mango-producer");
}
/**
* 从所有服务中选择一个服务(轮询)
*/
@RequestMapping("/discover")
public Object discover() {
return loadBalancerClient.choose("mango-producer").getUri().toString();
}
}
启动项目,观察consul用户界面,如下图所示:
四、测试
在浏览器中数据discover访问地址,先后两次分别访问8003、8004接口,是因为默认的负载均衡loadBalancerClient采用轮询方式。