• 正文
    • 一、組件介紹
    • 二、測試工程
    • 三、功能實現
    • 四、測試驗證
  • 相關推薦
申請入駐 產業(yè)圖譜

開啟SpringCloud + DDD 第1篇:Feign 的調用

2024/11/25
3431
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

作者:小傅哥,博客: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到云服務器教程以及各類場景解決方案。

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

作者小傅哥多年從事一線互聯網Java開發(fā),從19年開始編寫工作和學習歷程的技術匯總,旨在為大家提供一個較清晰詳細的核心技能學習文檔。如果本文能為您提供幫助,請給予支持(關注、點贊、分享)!