前面第三章主要是搭建了eureka的集群部署,还是基于高可用原则,用户服务和订单服务也应该需要集群部署。
用户服务的集群部署
- 用户服务的集群部署跟eureka的差不多,只需要将application.yml的port设置为动态参数即可。
############################################################
#
# 用户微服务
# web访问端口号 约定:8001
#
############################################################
server:
# 动态设置端口号,方便部署集群
port: ${port:8001}
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: user
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
# defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
# 用户服务注册到eureka集群中
defaultZone: http://eureka-cluster-7001:7001/eureka/,http://eureka-cluster-7002:7002/eureka/,http://eureka-cluster-7003:7003/eureka/
- idea服务配置中,传port参数。
订单服务的集群部署
- 将application.yml的port设置为动态参数。
############################################################
#
# 订单微服务
# web访问端口号 约定:8002
#
############################################################
server:
# 动态设置端口号,方便部署集群
port: ${port:8002}
tomcat:
uri-encoding: UTF-8
############################################################
#
# 配置项目信息
#
############################################################
spring:
application:
name: order
############################################################
#
# eureka配置信息
#
############################################################
eureka:
server:
hostname: localhost
port: 7000
client:
# 所有的微服务都必须注册到eureka中
register-with-eureka: true
# 从注册中心获得检索服务实例,用户服务需要配置为true
# 用户服务要去获得其他服务的实例,然后去调用
fetch-registry: true
# 注册中心的服务地址
service-url:
# defaultZone: http://${eureka.server.hostname}:${eureka.server.port}/eureka/
# 订单服务注册到eureka集群中
defaultZone: http://eureka-cluster-7001:7001/eureka/,http://eureka-cluster-7002:7002/eureka/,http://eureka-cluster-7003:7003/eureka/
- idea服务配置中,传port参数。
测试
- 启动用户服务和订单服务,观察eureka集群控制台效果。
- CloudConfig.java加上负载均衡。
package com.ft.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class CloudConfig {
public CloudConfig() {
}
/**
* 会基于OKHttp3的配置来配置RestTemplate
* @return
*/
@Bean
@LoadBalanced // 默认的负载均衡算法:轮询
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
}
- 用户调用订单服务方法改造。
@RestController
@RequestMapping("user")
public class UserController {
// 注入服务发现,可以获得已经注册的服务相关信息
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
/**
* 查询所有订单列表
*
* @return
* @throws Exception
*/
@PostMapping("/findOrderList")
public JSONArray findOrderList() throws Exception {
String serviceId = "ORDER";
// List<ServiceInstance> instanceList = discoveryClient.getInstances(serviceId);
// ServiceInstance orderSevice = instanceList.get(0);
// String url = "http://" + orderSevice.getHost() + ":" + orderSevice.getPort()
// + "/order/findOrderList";
String url = "http://" + serviceId + "/order/findOrderList";
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> formEntity = new HttpEntity<String>(null, headers);
JSONArray responseEntity
= restTemplate.postForObject(url, formEntity, JSONArray.class);
return responseEntity;
}
}
- 订单服务方法改造。
@RestController
@RequestMapping("order")
public class OrderController {
// 用于负载均衡测试效果
@Value("${server.port}")
private String port;
/**
* 查询所有订单列表
*
* @return
* @throws Exception
*/
@PostMapping("/findOrderList")
public JSONArray findOrderList() throws Exception {
JSONArray orderList = new JSONArray();
JSONObject o1 = new JSONObject();
o1.put("ordNo", "001");
o1.put("ordName", "鼠标");
JSONObject o2 = new JSONObject();
o2.put("ordNo", "002");
o2.put("ordName", "键盘");
JSONObject o3 = new JSONObject();
o3.put("port",port);
orderList.add(o1);
orderList.add(o2);
orderList.add(o3);
return orderList;
}
}
- postman反复调用订单服务,能发现端口一直在8002和8012之间切换,说明负载均衡生效,并且是轮询模式。