1.前置准备
已经搭建起nacos 服务注册中心
有一个订单Order(order-service) 服务,两个库存Stock(stock-service) 服务
目录结构如下:
2.order-server 和 stock-service的依赖和属性配置文件
在最外侧的pom也就是sample-spring-cloud-alibaba-ribbon\pom.xml中导入依赖管理配置
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后在order-service 和 stock-service的 pom.xml中加入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
由于在外侧的pom.xml中已经带入了依赖管理,所以这个位置的版本号可以省略,其中spring-boot-starter,spring-boot-starter-web的版本号由spring-boot-starter-parent提供,spring-cloud-starter-alibaba-nacos-discovery的版本由spring-cloud-alibaba-dependencies提供。
其中spring-cloud-starter-netflix-ribbon 会包含在spring-cloud-starter-alibaba-nacos-discovery中,不需要额外导入。
其中order-service 的application.properties内容如下
server.port=8080
#你的服务名称
spring.application.name=order-service
#nacos的配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=public
stock-service 的application.properties内容如下
server.port=8091
#你的服务名称
spring.application.name=stock-service
#nacos的相关配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.namespace=public
spring.cloud.nacos.discovery.ephemeral=false
3.RestTemplate开启负载均衡
创建CustomConfiguration类,用于定义RestTemplate,同时加入LoadBalanced
开启负载均衡功能
@Configuration
public class CustomConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
后续如果使用openFeign进行服务调用的话,则不需要这么麻烦,ribbon会被整合,同时也不需要使用restTemplate
4.使用RestTemplate发起服务请求
在stock-service 中,开发测试用的controller 方法
@RestController
@RequestMapping("/stock")
public class StockRestController {
@Value("${server.port}")
private String port;
@GetMapping("/submit")
public String submit() {
return "去庫存成功 : " + port;
}
}
在order-service中,开发测试用的controller 方法
@RestController
@RequestMapping("/order")
public class OrderRestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/submit")
public String submit() {
ResponseEntity<String> stringResponseEntity = restTemplate.getForEntity("http://stock-service/stock/submit", String.class);
return "下單成功 " + stringResponseEntity.getBody();
}
}
此时目录结果如下:
以上代码使用restTemplate 发起了一次请求,会从服务注册中心获取所有可用的stock-service服务,并按照配置好的默认策略(ZoneAvoidanceRule)进行负载均衡。
由于测试负载均衡需要使用两个stock-service,我这边使用的开发工具是idea,可以复制多一个启动配置,并更改端口
在浏览器输入http://127.0.0.1:8080/order/submit 后,就能看到返回的信息在8091和8092之间不断转换
5.修改负载均衡的规则
修改的方法有两种
第一种,在order-service 添加一个新的配置类RibbonConfiguration
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
注意,假如该配置类能够被spring boot 的包所扫描,那么这个策略将会被应用到所有的服务调用上。
如果你只需要该策略生效在某一个服务调用上,需要将RibbonConfiguration放到不能被spring boot 所能扫描,或者在包扫描配置的地方排除该类,然后再需要生效的服务即可
@SpringBootApplication
@RibbonClients(value = {
@RibbonClient(name = "stock-service", configuration = RibbonConfiguration.class)
})
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.*run*(OrderServiceApplication.class, args);
}
}
第二种方法,直接在配置文件修改,推荐使用该方法,比较方便
stock-service.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
其中stock-service是你希望该规则生效的服务名