您好,登錄后才能下訂單哦!
這篇文章主要講解了“Dubbo Service Mesh基礎架構組件源碼分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Dubbo Service Mesh基礎架構組件源碼分析”吧!
除了Alibaba Dubbo
,公司使用Zookeeper
作為配置中心,分布式消息隊列rocketmq
,分布式緩存redis
,阿里云分庫分表產品DRDS
,阿里云關系型數據庫RDS
,這些基礎組件在整個Service Mesh
架構的改造中是不變的。
Dubbo項目Service Mesh改造具體實現 基礎技術方案
將Dubbo
架構改造成Service Mesh
架構就要Dubbo
框架從項目中移除,我們這里將Dubbo
框架移除,并且將服務端接口全部改造成rest
接口,這就需要服務端使用新的容器發布rest
接口,所以干脆就將項目改造成Sping Boot Web
應用,協議問題沒有了,但是如何盡可能改動小的能夠讓消費端快速的接入Sping Boot Web
應用的服務端就成為了難點,由于Dubbo
項目API
模塊的作用與Spring Cloud Feign
模塊的作用十分相似,模塊內都是一些interface
,需要服務端定義xxxServiceImpl
去實現各個interface
,然后消費者通過Spring
依賴注入將interface
注入并使用,這就使得Dubbo
最復雜的服務間調用方式有了解決的方案。
基礎組件改造
根pom.xml引入SpringBoot parent,增加 spring-cloud-dependencies import引用
刪除所有dubbo
相關引用。
這一步驟簡單來說就是將pom.xml中Dubbo的所有jar依賴全部刪除,并且引入SpringBoot parent和 spring-cloud-dependencies的引用,例如:
改造前:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.8.4</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> <exclusion> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> </exclusion> <exclusion> <artifactId>curator-framework</artifactId> <groupId>org.apache.curator</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> <exclusions> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <!-- 移除log4j的打印框架,否則,log 4j日志不生效 --> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>log4j</artifactId> <groupId>log4j</groupId> </exclusion> </exclusions> </dependency> </dependencies> </project>
改造后:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.3.RELEASE</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>feign-hystrix</artifactId> <groupId>io.github.openfeign</groupId> </exclusion> <exclusion> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <groupId>org.springframework.cloud</groupId> </exclusion> <exclusion> <artifactId>spring-cloud-starter-netflix-archaius</artifactId> <groupId>org.springframework.cloud</groupId> </exclusion> <exclusion> <artifactId>spring-cloud-netflix-ribbon</artifactId> <groupId>org.springframework.cloud</groupId> </exclusion> </exclusions> </dependency> </dependencies> </project>
Dubbo門面API改造
pom.xml
增加spring-cloud-starter-openfeign
引用。
刪除所有Dubbo
相關引用Dubbo
相關配置文件。
Dubbo
原有API
接口是標準的JAVA
接口定義,與Feign Restful
接口定義十分類似。這里可以在原有的API
接口基礎上增加 @FeignClient
、@RequestMapping
等注解,將一個普通的API
接口改造成一個Feign Restful
接口,后續會使用Feign
這個 Restful
框架來處理服務間調用等問題。由于Feign
本身是自帶了Ribbon
負載均衡,服務訪問者經過負載均衡后會找到服務提供者的一個 IP+Port進行調用,這與K8S Service
要求的服務名調用的方式相沖突,所以必須想辦法去掉Feign
自帶的負載均衡。好在 @FeignClient
可以手工指定一個固定的調用地址,這里可以把這個地址設置成K8S Service
的name
名稱,從而實現了通過Feign
對 K8S Service
服務名調用的能力。此部分需要每個API
接口增加注解一次,改造工作量相對可控。
由于Feign
要求接口使用Restful
格式,所以接口中的每個抽象方法都必須添加@RequestMapping
,@GetMapping
,@PostMapping
等注解暴露成一個Restful
資源地址。此部分改造涉及到每個API
接口的每個抽象方法,是整個方案里改動量最大的一部分。
此部分整體改造工作量取決于原有的Dubbo
項目包含多少個API
接口,以及每個API
包含多少個抽象方法。
改造前示例:
public interface IOdaApi { ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(ConsumptionODARequest consumptionODARequest); ModelsReturn<ModelsCommonResponse<RefundODAResponse>> refundODA(RefundODARequest refundODARequest); ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionQueryODA( ConsumptionQueryODARequest consumptionQueryODARequest); ModelsReturn<ModelsCommonResponse<String>> repayODA(RepayODARequest repayODARequest); }
改造后示例:
@FeignClient(name = "miss-xxx-svc", url = "http://miss-xxx-svc:8080") public interface IOdaApi { @PostMapping(value = "/xxxService/consumptionODA") ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(@RequestBody ConsumptionODARequest consumptionODARequest); }
Dubbo Provider端改造
pom.xml
增加spring-boot-starter-web
、spring-cloud-starter-openfeign
等引用,同時增加SpringBoot
mainClass 標準啟動項配置。刪除所有Dubbo
相關引用、Dubbo
相關配置文件。
增加SpringBoot
啟動類,增加@SpringBootApplication
、@EnableFeignClients
兩個注解,配置dubbo provider服務端口號。
xxxServiceImpl服務實現類上增加@RestController
注解,提供 consumer Restful 訪問的能力。 這個需要每個服務實現類都加上@RestController
注解,不要遺漏。
此部分大都屬于一次性改動,改造工作量相對可控。
改造后示例:
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> ... </parent> <artifactId>MISS.xxxService</artifactId> <dependencies> <dependency> <groupId>com.xxx.xxx</groupId> <artifactId>MISS.xxxService.API</artifactId> <version>2.0.5-RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <build> ... </build> </project>
改造后的 OdaImpl.java 代碼示例(改造前只是缺少 @RestController 注解,其他代碼完全一致):
@Slf4j @RestController public class OdaImpl implements IOdaApi { @Resource private OdaService odaService; @Override public ModelsReturn<ModelsCommonResponse<ConsumptionODAResponse>> consumptionODA(ConsumptionODARequest consumptionODARequest) { try { Validation.validate(consumptionODARequest); ... return ErrorCode.returnMsg(ErrorCode.OPSERATE_SUCCESS, odaService.consumptionODA(consumptionODARequest.getMultiIndustryInfo(),consumptionODA)); } catch (Exception e) { log.error(LogUtil.exceptionMarker(), "ODA交易異常",e); return ErrorCode.returnMsgByErrorMessage(ErrorCode.PARA_ERROR, "ODA交易異常"); } } }
Dubbo Comsumer端改造
pom.xml
增加spring-boot-starter-web
、spring-cloud-starter-openfeign
等引用,同時增加SpringBoot
mainClass 標準啟動項配置。
刪除所有Dubbo
相關引用、Dubbo
相關配置文件。
增加SpringBoot
啟動類,增加@SpringBootApplication
、@EnableFeignClients
(需要配置 basePackages 掃描包路徑) 兩個注解,并配置dubbo consumer服務端口號。
此部分大都屬于一次性改動,改造工作量相對可控。
由于dubbo consumer項目改造與dubbo provider改造極其相似,這里不再貼出代碼示例。
感謝各位的閱讀,以上就是“Dubbo Service Mesh基礎架構組件源碼分析”的內容了,經過本文的學習后,相信大家對Dubbo Service Mesh基礎架構組件源碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。