1、准备环境
Eureka注册中心注册了两个商品服务product-service,端口分别是8081,8082
然后创建一个order-service服务区调用product-service
product-service中有一个Controller, 每次被调用会输出自身的端口
@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
@Value("${server.port}")
private String port;
/**
* 根据id查找商品详情
* @param id
* @return
*/
@RequestMapping("find")
public Object findById(int id){
Product p1 = new Product(id,"iphonex",9999, 10);
System.out.println("data from port" + port);
return p1;
}
}
2、order-service
2.1、pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2、配置文件
application.yml
指注册中心置中心
server:
port: 8090
#指定注册中心地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7001/eureka/
#服务的名称
spring:
application:
name: order-service
2.3、调用服务的方式
OrderController
@RestController
@RequestMapping("api/v1/order")
public class OrderController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("save")
public Object save(@RequestParam("product_id") int productId){
Object forObject = restTemplate.getForObject("http://product-service/api/v1/product/find?id="+productId, String.class);
return forObject;
}
}
2.4、配置类
@SpringBootApplication
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
//引入
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.5、测试
启动order-service,在postman中测试,
多测几次发现是轮训的负载模式。
3、自定义负载均衡策略
Ribbon内置了7中负载均衡策略
使用配置文件自定义负载均衡
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则全类名
策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule
测试10次: