作者:小傅哥,博客:https://bugstack.cn
大家好,我是技術UP主小傅哥。
在過往幾年中在幫助大家學習編程中,我會看到不少新人伙伴在項目的時候會糾結,這個是RPC(Dubbo)的、這個是 SpringCloud(Feign)的,這個是 MVC 的、這個是 DDD 的。但其實不用糾結一點都。
其實這些東西都是一通百通
一個能把 Dubbo 用的透徹的人,換成 Feign 就是小兒科。一個能把 MVC 搞的明明白白的人,換成 DDD 那就是手到擒來。之所以有人會覺得換一下就不會了,是因為原本另外一個就沒用明白。各類的工具、框架、組件,在編程中都有非常多的同類替代品。就算即使是 RPC 也是有非常多的產品,尤其中大廠中還有很多自研的組件。
那么今天小傅哥就再分享下 SpringCloud Feign 結合到 DDD 戰(zhàn)術設計六邊形架構中的使用方式。
一、組件介紹
官網:https://spring.io/projects/spring-cloud
Spring Cloud 為開發(fā)人員提供了一系列工具,用于快速構建分布式系統(tǒng)中的一些常見模式(例如配置管理、服務發(fā)現、斷路器、智能路由、微代理、控制總線、微服務和契約測試)。分布式系統(tǒng)的協調產生了樣板模式,使用 Spring Cloud,開發(fā)人員可以快速建立實現這些模式的服務和應用程序。它們可以在任何分布式環(huán)境中很好地工作,包括開發(fā)人員自己的筆記本電腦、裸機數據中心和 Cloud Foundry 等托管平臺。
本節(jié)會涉及到 Eureka 注冊中心、Feign 簡化微服務 HTTP 調用組件;
- Eureka 是一個由 Netflix 開發(fā)的服務發(fā)現工具,主要用于云端分布式系統(tǒng)中。它允許各個服務在啟動時注冊自己的信息,并能夠動態(tài)地發(fā)現其他服務的位置和狀態(tài),從而實現負載均衡和故障轉移。Eureka 在微服務架構中扮演著重要角色,幫助提高系統(tǒng)的可用性和彈性。其易于集成的特性使其成為許多企業(yè)在構建復雜分布式應用時的首選工具之一。Feign 是一個受歡迎的 Java HTTP 客戶端庫,主要用于簡化服務間的 HTTP 通信。它通過使用注解來定義 HTTP 請求接口,使得開發(fā)者可以更直觀地調用遠程服務。Feign 提供了可插拔的編碼器和解碼器,支持多種數據格式,并且可以與 Spring Cloud 集成,方便地實現負載均衡和服務發(fā)現。其簡潔的 API 和高度的可擴展性,使得 Feign 成為微服務架構中常用的工具之一。
二、測試工程
小傅哥這里給搭建了一套測試 Feign 案例的六邊形系統(tǒng)架構;
工程:https://github.com/fuzhengwei/xfg-dev-tech-springcloud-feign
- eureka 模塊,包括;server、client 端,server 端是注冊中心,用于接收注冊上來的服務接口,統(tǒng)一管理負載。client 端是為了模擬提供一個服務接口。你可以任何其他工程來提供 feign 客戶端接口,也就是接口的提供方。這樣消費方就可以通過注冊中心調用了。infrastructure 是基礎設施層,在六邊形架構中,用于處理調用外部的接口,內部的數據庫,緩存等這樣的基礎功能。在 DDD 的軟件設計方法中,會把這部分基礎的東西從功能實現中拆分出來。domain 和 infrastructure 是依賴倒置關系,所有 domain 要實現的服務需要的基礎數據,都可以通過依賴倒置方式處理。也就是 domain 領域層定義接口,之后由基礎設置層做功能實現。在通過 Spring 注入到 domain 領域中 service 具體的類中,這樣就可以使用。trigger 名詞為觸發(fā)器,用于承載給外部提供的服務能力,包括;http接口、rpc接口、job任務等,這些要調用我們服務能力的方式,都可以通過 trigger 層來實現。
更多的關于 DDD 六邊形架構,可以從編程路書中學習;https://bugstack.cn/md/road-map/ddd-guide-03.html
三、功能實現
1. 引入 spring cloud
<parent>
????<groupId>org.springframework.boot</groupId>
????<artifactId>spring-boot-starter-parent</artifactId>
????<version>2.0.6.RELEASE</version>
????<relativePath/>
</parent>
<dependencyManagement>
????<dependencies>
????????<dependency>
????????????<groupId>org.springframework.cloud</groupId>
????????????<artifactId>spring-cloud-dependencies</artifactId>
????????????<version>Finchley.SR2</version>
????????????<type>pom</type>
????????????<scope>import</scope>
????????</dependency>
????????<dependency>
????????????<groupId>com.alibaba</groupId>
????????????<artifactId>fastjson</artifactId>
????????????<version>2.0.28</version>
????????</dependency>
????</dependencies>
</dependencyManagement>
- 在官網中有對應版本關系可以參考:https://spring.io/projects/spring-cloud
2. eureka-server
在公司中 eureka-server 是統(tǒng)一一套的,我們個人學習需要搭建一個這樣的工程。
2.1 yml 配置
server:
??port:?7397
eureka:
??instance:
????hostname:?localhost
??client:
????registerWithEureka:?false
????fetchRegistry:?false
????serviceUrl:
??????defaultZone:?http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
??application:
????name:?eureka-server
- 添加 eureka 配置信息。這個端口 7397 后面其他的客戶端調用就連接這個端口。
2.2 啟動類
package?cn.bugstack.xfg.dev.tech;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
import?org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public?class?EurekaServerApplication?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(?EurekaServerApplication.class,?args?);
????}
}
3. Eureka-client
3.1 yml 配置
server:
??port:?8002
spring:
??application:
????name:?eureka-client-api
eureka:
??client:
????serviceUrl:
??????defaultZone:?http://localhost:7397/eureka/
- 模擬啟動一個客戶端接口,并填寫注冊中心地址。
3.2 api 接口
@EnableEurekaClient
@RestController
public?class?TestApiController?{
????@Value("${server.port}")
????private?int?port;
????@RequestMapping(path?=?"/api/queryUserInfo",?method?=?RequestMethod.GET)
????public?String?queryUserInfo(@RequestParam?String?userId)?{
????????return?"Hi 小傅哥,微信公眾號:bugstack蟲洞棧?|?"?+?userId?+?"?>:?from?eureka?client?port:?"?+?port;
????}
}
-
- 添加一個客戶端的接口,這里需要注意的是添加了一個
@EnableEurekaClient
- 注解。這樣這個接口就可以被 eureka 注冊中心管理。如果你有學習過小傅哥的API網關項目,那么就可以了解這樣的設計,是如何完成接口注冊的。
4. 接口使用 - infrastructure
在工程的基礎設置層配置對外部的接口調用;
如果沒有 fegin 我們最開始調用外部的 http 接口時候,就需要寫很多的關于 http 的調用,這個過程是比較復雜的。在使用 feign 后,這個事就變得簡單了,同時還增加了負載和故障遷移的能力。
當然現在調用http的方式不只是以前的刀耕火種了,可以用 okttp、retrofit2 這樣的框架處理 http 調用過程。如下這樣的調用方式也是非常好維護的。
@GET("cgi-bin/token")
Call<WeixinTokenRes>?getToken(@Query("grant_type")?String?grantType,
@Query("appid")?String?appId,
@Query("secret")?String?appSecret);
四、測試驗證
1. eureka 啟動
- 分別啟動 eureka 的服務端和測試的客戶端,提供接口能力。啟動后訪問 eureka 服務端:http://127.0.0.1:7397/
2. 測試工程啟動
fuzhengwei@MacBook-Pro?xfg-dev-tech-springcloud-feign?%?curl?http://127.0.0.1:8091/api/v1/query_user_info
Hi 小傅哥,微信公眾號:bugstack蟲洞棧?| xfg >: from eureka client port:?8002%?
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@680aded0
24-11-24.10:32:49.968?[PollingServerListUpdater-0]?INFO??ChainedDynamicProperty?-?Flipping?property:?eureka-client-api.ribbon.ActiveConnectionsLimit?to?use?NEXT?property:?niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit?=?2147483647
-
- 啟動應用測試工程,啟動后可以訪問驗證。驗證接口:
http://127.0.0.1:8091/api/v1/query_user_info
加入小傅哥的星球「碼農會鎖」,斬獲大廠Offer!閱讀500+份簡歷和評審,學習6個業(yè)務項目;MVC+DDD,雙架構開發(fā)小型電商
、大營銷(超級大課)
、OpenAI 大模型應用
、Lottery
、IM
、AI 問答助手
。7個組件項目;OpenAI 代碼評審
、BCP 透視業(yè)務監(jiān)控
、動態(tài)線程池
、支付SDK設計和開發(fā)
、API網關
、SpringBoot Starter
、IDEA Plugin 插件開發(fā)
。1套源碼課程、1套基礎教程、1到云服務器教程以及各類場景解決方案。