Spring Cloud系列_11 Feign负载均衡、请求传参
发布日期:2021-05-07 01:21:35 浏览次数:7 分类:技术文章

本文共 3945 字,大约阅读时间需要 13 分钟。

Feign的负载均衡

Feign封装了Ribbon,所以也可以使用Ribbon负载均衡

全局:

配置类中注入负载均衡规则:随机,什么都不配置默认使用轮询

@Configurationpublic class RestTemplateConfig {    @Bean    public RandomRule randomRule(){        return new RandomRule();    }}

启动之后能看到结果

{"id":1,"orderNo":"order01","orderAddress":"address","totalPrice":200,"productList":[{"id":1,"name":"产品1-7073","num":1,"price":100},{"id":2,"name":"产品2-7073","num":2,"price":200},{"id":3,"name":"产品2-7073","num":3,"price":300}]}
{"id":1,"orderNo":"order01","orderAddress":"address","totalPrice":200,"productList":[{"id":1,"name":"产品1-7074","num":1,"price":100},{"id":2,"name":"产品2-7074","num":2,"price":200},{"id":3,"name":"产品2-7074","num":3,"price":300}]}

返回的数据显示,7073和7074两个服务随机请求,注意看“产品2-7073”和“产品2-7074”

局部

配置:

service-provider:    ribbon:        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Feign的请求传参

GET

使用@Pathvariable和@RequestParam注解接收参数

还是使用service-provider做演示,方便起见就不搞集群了。

增加一个根据ID查询产品信息的接口

ProductServiceImpl.java

@Override    public Product selectProductById(Long id) {        return new Product(id,"产品"+id+"-7073",1,new BigDecimal("100"));    }

ProductController.java

@GetMapping(value = "getProductsById/{id}")    public Product getProductsById(@PathVariable("id") Long id){        return productService.selectProductById(id);    }

然后是consumer-service-feign-7100,增加一个接口

ProductService.java

@GetMapping(value = "/provider/getProductsById/{id}")    Product getProductsById(@PathVariable("id") Long id);

OrderServiceImpl.java

@Override    public Order getById(Long id) {        return new Order(id,"order01","address",new BigDecimal("200"), Collections.singletonList(productService.getProductsById(id)));    }

OrderController.java

@GetMapping(value = "getById/{id}")    public Order getById(@PathVariable("id") Long id){        return orderService.getById(id);    }

POST

使用@requestBody注解接收参数

还是使用service-provider做演示,增加了一个POST根据ID获取和添加Product的接口

ProductServiceImpl.java

@Override    public Product selectProductByIdWithPost(Long id) {        return new Product(id,"产品"+id+"-7073",1,new BigDecimal("100"));    }    @Override    public Map
createProduct(Product product) { System.out.println("product = " + product); Map
result = new HashMap<>(2); result.put("code","200"); result.put("message","success"); return result; }

ProductController.java

@PostMapping(value = "getProductsByIdWithPost")    public Product selectProductByIdWithPost(@RequestBody Product product){        return productService.selectProductByIdWithPost(product.getId());    }    @PostMapping(value = "create")    public Map
getProductsById(@RequestBody Product product){ return productService.createProduct(product); }

然后是consumer-service-feign-7100,增加两个对应的接口

ProductService.java

@PostMapping(value = "/provider/getProductsByIdWithPost")    Product selectProductByIdWithPost(Product product);    @PostMapping(value = "/provider/create")    Map
createProduct(Product product);

OrderServiceImpl.java

@Override    public Order selectProductByIdWithPost(Product product) {        return new Order(product.getId(),"order01","address",new BigDecimal("200"), Collections.singletonList(productService.selectProductByIdWithPost(product)));    }    @Override    public Map
createProduct(Product product) { return productService.createProduct(product); }

OrderController.java

@PostMapping(value = "getProductsByIdWithPost")    public Order selectProductByIdWithPost(@RequestBody Product product){        return orderService.selectProductByIdWithPost(product);    }    @PostMapping(value = "create")    public Map
getProductsById(@RequestBody Product product){ return orderService.createProduct(product); }

测试样例

POST http://localhost:7100/order/getProductsByIdWithPostContent-Type: application/json{"id": 2}###POST http://localhost:7100/order/createContent-Type: application/json{"id": 2,"name": "name2"}

 

上一篇:采用编码器-解码器匹配语义分割的图像压缩
下一篇:遗传算法求解几何问题

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月31日 09时36分27秒