您現在的位置是:首頁 > 垂釣

微服務服務管理混亂?還不會閘道器?教你使用閘道器實現服務聚合

  • 由 攻城獅Chova 發表于 垂釣
  • 2022-02-17
簡介————————————————————————————————————————————————————————————————————————————————————————————————————————服務提供方:——————————

掌上閘道器怎麼用

服務聚合之 API Gateway

API閘道器的服務聚合

服務聚合實現

微服務服務管理混亂?還不會閘道器?教你使用閘道器實現服務聚合

API閘道器的服務聚合

透過同一個入口路由到不同的服務上

服務聚合實現

由於伺服器在叢集部署的時候,同一個服務內容存在多個不同的服務IP地址,所以不能直接透過IP地址訪問服務

API服務訪問的時候要先獲取服務的IP地址,然後再訪問服務

進行服務聚合的專案要稱為服務提供者(實現服務介面),服務提供者的SpringApplication要加Main。main(args)提供遠端呼叫介面給API閘道器

此時可以獲取到服務的IP地址

如何獲取服務IP地址?

微服務服務管理混亂?還不會閘道器?教你使用閘道器實現服務聚合

上下文資訊:上下文中存放的是當前呼叫過程中所需的環境資訊,所有配置資訊都將轉換為 URL 的引數。RpcContext 是一個 ThreadLocal 的臨時狀態記錄器,當接收到 RPC 請求,或發起 RPC 請求時,RpcContext 的狀態都會變化。比如:A 調 B,B 再調 C,則 B 機器上,在 B 調 C 之前,RpcContext 記錄的是 A 調 B 的資訊,在 B 調 C 之後,RpcContext 記錄的是 B 調 C 的資訊服務消費方:——————————————————————————————————————————————————————————————————————————————————————————————————————// 遠端呼叫xxxService。xxx();// 本端是否為消費端,這裡會返回trueboolean isConsumerSide = RpcContext。getContext()。isConsumerSide();// 獲取最後一次呼叫的提供方IP地址String serverIP = RpcContext。getContext()。getRemoteHost();// 獲取當前服務配置資訊,所有配置資訊都將轉換為URL的引數String application = RpcContext。getContext()。getUrl()。getParameter(“application”);// 注意:每發起RPC呼叫,上下文狀態會變化yyyService。yyy();————————————————————————————————————————————————————————————————————————————————————————————————————————服務提供方:————————————————————————————————————————————————————————————————————————————————————————————————————————public class XxxServiceImpl implements XxxService { public void xxx() { // 本端是否為提供端,這裡會返回true boolean isProviderSide = RpcContext。getContext()。isProviderSide(); // 獲取呼叫方IP地址 String clientIP = RpcContext。getContext()。getRemoteHost(); // 獲取當前服務配置資訊,所有配置資訊都將轉換為URL的引數 String application = RpcContext。getContext()。getUrl()。getParameter(“application”); // 注意:每發起RPC呼叫,上下文狀態會變化 yyyService。yyy(); // 此時本端變成消費端,這裡會返回false boolean isProviderSide = RpcContext。getContext()。isProviderSide(); } }————————————————————————————————————————————————————————————————————————————————————————————————————————

在配置檔案的service中配置上需要聚合的服務以及版本

建立路由controller

@Controllerpublic class RouterController{ @Value(value=${services。ports。user}) private String userPort; @Value(value=${services。ports。content}) private String contentPort; @Reference private UserConsumerService userConsumerService; @Reference private ContentConsumerService contentConsumerService; @RequestMapping(value=“user”,method=RequestMethod。GET) public String user(String path){ userConsumerService。info(); return getRequest(userPort,path); } @RequestMapping(value=“content”,method=RequestMethod。GET) public String content(String path){ contentConsumerService。info(); return getRequest(contentPort,path); } public String getRouter(String serverPort,String path){ // 判斷是否為消費者 boolean isConsumerSide=RpcContext。getContext()。isConsumerSide(); if(isConsumerSide){ // 獲取最後一次呼叫的提供方的IP地址 String serverIP=RpcContext。getContext()。getRemoteHost() return String。format(“redirect:http://%s:%s%s”,serverIP,serverPort,path); } return null; }}

微服務服務管理混亂?還不會閘道器?教你使用閘道器實現服務聚合

Top