一. 服务提供方: spring-cloud-order-api项目
1. OrderController
@RestController
@RequestMapping("/order")
public class OrderController {
@Value(("${server.port}"))
private Integer port;
@RequestMapping("/findOrderList")
public String findOrderList() {
System.out.println("OrderController findOrderList 这就是订单服务端,port " + port);
System.out.println("OrderController findOrderList 这就是订单服务端,开始查询订单信息集合, 时间: "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
return "OrderController findOrderList : this is orderList";
}
}
2. pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zsw</groupId>
<artifactId>spring-cloud-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-order-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. application.yml设置
server:
port: 8082
4.1 spring-cloud-order-api项目集群部署,测试时启动多个不同端口的项目即可![](https://i-blog.csdnimg.cn/blog_migrate/98a93a9488998b37aae40f303f117838.png)
4.2 启动多个项目
4.3 启动后的日志
二. 准备调用spring-cloud-order-service的项目
1.准备
1.1 添加依赖
<!-- spring-cloud-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
1.2 yml添加配置:
# ribbon配置指定服务提供者的地址
spring-cloud-order-service:
ribbon:
listOfServers:
localhost:8082,localhost:8083
2. 直接调用固定ip地址和端口的项目: restTemplate
2.1 测试控制类
@RestController
@RequestMapping("/user1")
public class UserController1 {
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping("/findOrderList")
public String findOrderList() {
System.out.println("TestController1 findOrderList 调用订单服务查询订单信息集合: "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
String orderList = restTemplate.getForObject("http://127.0.0.1:8082/order/findOrderList", String.class);
System.out.println("订单服务响应信息: " + orderList);
return orderList;
}
}
2.2 结果
3. 通过yml配置多个服务端地址+restTemplate+ribbon实现负载均衡
ribbon完成的工作:
1). 获取服务端地址列表;
2). 通过负载均衡算法完成请求拦截转发;
3.1 测试控制类
@RestController
@RequestMapping("/user2")
public class UserController2 {
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private LoadBalancerClient loadBalancerClient;
@RequestMapping("/findOrderList")
public String findOrderList() {
System.out.println("TestController2 findOrderList 调用订单服务查询订单信息集合: "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
ServiceInstance serviceInstance = loadBalancerClient.choose("spring-cloud-order-service");
String url = String.format("http://%s:%s/order/findOrderList", serviceInstance.getHost(),
serviceInstance.getPort());
System.out.println("ribbon - 负载均衡 - url: " + url);
String orderList = restTemplate.getForObject(url, String.class);
System.out.println("订单服务响应信息: " + orderList);
return orderList;
}
}
3.2 结果
4. 使用@LoadBalanced改造 3, 实现负载均衡
4.1 测试控制类
@RestController
@RequestMapping("/user3")
public class UserController3 {
@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping("/findOrderList")
public String findOrderList() {
System.out.println("TestController3 findOrderList 调用订单服务查询订单信息集合: "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
String url = "http://spring-cloud-order-service/order/findOrderList";
System.out.println("ribbon - 负载均衡 - url: " + url);
String orderList = restTemplate.getForObject(url, String.class);
System.out.println("订单服务响应信息: " + orderList);
return orderList;
}
}
4.2 结果与2.2一致
5. openFeign实现负载均衡
5.1 添加依赖
<!-- spring-cloud-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
5.2 openFeign服务端
@FeignClient("spring-cloud-order-service")
public interface OrderFeignClient {
@GetMapping("/order/findOrderList")
String findOrderList();
}
5.3 启动类上加上注解@EnableFeignClients
5.4 测试控制类
@RestController
@RequestMapping("/user4")
public class UserController4 {
@Autowired
private OrderFeignClient orderFeignClient;
@RequestMapping("/findOrderList")
public String findOrderList() {
System.out.println("TestController4 findOrderList 调用订单服务查询订单信息集合: "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
String orderList = orderFeignClient.findOrderList();
System.out.println("订单服务响应信息: " + orderList);
return orderList;
}
}
5.5 结果