八、服務呼叫Ribbon入門
前面我們已經實作了服務的注冊和服務發現,當啟動某個服務的時候,可以通過HTTP的形式將資訊注冊到注冊中心,并且可以通過Spring Cloud提供的工具獲取注冊中心的服務串列,
但是服務之間的呼叫還存在很多的問題,如:如何更加方便的呼叫微服務,多個微服務的提供者如何選擇,如何負載均衡等等,
8.1 Ribbon概述
Ribbon是 Netflixfa發布的一個負載均衡器,有助于控制 HTTP 和TCP客戶端行為,在SpringCloud 中,Eureka一般配合Ribbon進行使用,Ribbon提供了客戶端負載均衡的功能,Ribbon利用從Eureka中讀取到的服務資訊,在呼叫服務節點提供的服務時,會合理的進行負載,
在Spring Cloud中可以將注冊中心和Ribbon配合使用,Ribbon自動的從注冊中心中獲取服務提供者的串列資訊,并基于內置的負載均衡演算法,請求服務,
8.2 Ribbon的主要作用
-
服務呼叫
基于Ribbon實作服務呼叫, 是通過拉取到的所有服務串列組成(服務名-請求路徑的)映射關系,借助RestTemplate 最終進行呼叫,
-
負載均衡
當有多個服務提供者時,Ribbon可以根據負載均衡的演算法自動的選擇需要呼叫的服務地址,
8.3 基于Ribbon實作訂單呼叫商品服務
前面我們配置了Eureka Server高可用集群,但是如何均衡的呼叫服務還并未實作,也就是說,在此基礎上添加負載均衡策略即可實作,
服務提供者ebuy-product
ProductController.java
package cn.ebuy.product.controller;
import cn.ebuy.product.pojo.EasybuyProduct;
import cn.ebuy.product.service.EasybuyProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/product")
@SuppressWarnings("all")
public class ProductController {
@Value("${spring.cloud.client.ip-address}")
String ip;
@Value("${server.port}")
int port;
@Autowired
private EasybuyProductService productService;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public EasybuyProduct findById(@PathVariable Long id) {
EasybuyProduct product = productService.selectByPrimaryKey(id);
product.setEpDescription("呼叫ebuy-product服務,ip:"+ip+",服務提供者埠:"+port);
return product;
}
}
服務呼叫者ebuy-order(需要配置負載均衡)
application.yml
##需要呼叫的微服務名稱
ebuy-product:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載均衡策略:
啟動類OrderApplication.java
package cn.ebuy.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderApplication {
/**
* 配置RestTemplate交給spring管理
* 基于Ribbon的服務呼叫與負載均衡
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate()
{
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
注意:服務消費者方在RestTemplate上的@LoadBalanced注解一定不能少,否則在呼叫時不能實作負載均衡!!!
Controller層實作:
package cn.ebuy.order.controller;
import cn.ebuy.order.pojo.EasybuyProduct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@RequestMapping("/order")
@SuppressWarnings("all")
public class OrderController {
@Autowired
RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 負載均衡
* @param id
* @return
*/
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public EasybuyProduct findById(@PathVariable Long id) {
EasybuyProduct easybuyProduct=new EasybuyProduct();
// 這里直接呼叫負載均衡策略上配置的需要呼叫的微服務名稱
easybuyProduct = restTemplate.getForObject("http://ebuy-product/product/"+id,EasybuyProduct.class);
return easybuyProduct;
}

到此為止,一個簡單的基于Eureka Server集群的服務之間的呼叫就完成了,如有不對,歡迎大家指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300197.html
標籤:其他
