加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、組件介紹
    • 二、測(cè)試工程
    • 三、功能實(shí)現(xiàn)
    • 四、測(cè)試驗(yàn)證
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

開啟SpringCloud + DDD 第1篇:Feign 的調(diào)用

11/25 14:50
1119
閱讀需 17 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

作者:小傅哥,博客:https://bugstack.cn

大家好,我是技術(shù)UP主小傅哥。

在過往幾年中在幫助大家學(xué)習(xí)編程中,我會(huì)看到不少新人伙伴在項(xiàng)目的時(shí)候會(huì)糾結(jié),這個(gè)是RPC(Dubbo)的、這個(gè)是 SpringCloud(Feign)的,這個(gè)是 MVC 的、這個(gè)是 DDD 的。但其實(shí)不用糾結(jié)一點(diǎn)都。

其實(shí)這些東西都是一通百通

一個(gè)能把 Dubbo 用的透徹的人,換成 Feign 就是小兒科。一個(gè)能把 MVC 搞的明明白白的人,換成 DDD 那就是手到擒來。之所以有人會(huì)覺得換一下就不會(huì)了,是因?yàn)樵玖硗庖粋€(gè)就沒用明白。各類的工具、框架、組件,在編程中都有非常多的同類替代品。就算即使是 RPC 也是有非常多的產(chǎn)品,尤其中大廠中還有很多自研的組件。

那么今天小傅哥就再分享下 SpringCloud Feign 結(jié)合到 DDD 戰(zhàn)術(shù)設(shè)計(jì)六邊形架構(gòu)中的使用方式。

一、組件介紹

官網(wǎng):https://spring.io/projects/spring-cloud

Spring Cloud 為開發(fā)人員提供了一系列工具,用于快速構(gòu)建分布式系統(tǒng)中的一些常見模式(例如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、微服務(wù)和契約測(cè)試)。分布式系統(tǒng)的協(xié)調(diào)產(chǎn)生了樣板模式,使用 Spring Cloud,開發(fā)人員可以快速建立實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。它們可以在任何分布式環(huán)境中很好地工作,包括開發(fā)人員自己的筆記本電腦、裸機(jī)數(shù)據(jù)中心和 Cloud Foundry 等托管平臺(tái)。

本節(jié)會(huì)涉及到 Eureka 注冊(cè)中心、Feign 簡(jiǎn)化微服務(wù) HTTP 調(diào)用組件;

    Eureka 是一個(gè)由 Netflix 開發(fā)的服務(wù)發(fā)現(xiàn)工具,主要用于云端分布式系統(tǒng)中。它允許各個(gè)服務(wù)在啟動(dòng)時(shí)注冊(cè)自己的信息,并能夠動(dòng)態(tài)地發(fā)現(xiàn)其他服務(wù)的位置和狀態(tài),從而實(shí)現(xiàn)負(fù)載均衡和故障轉(zhuǎn)移。Eureka 在微服務(wù)架構(gòu)中扮演著重要角色,幫助提高系統(tǒng)的可用性和彈性。其易于集成的特性使其成為許多企業(yè)在構(gòu)建復(fù)雜分布式應(yīng)用時(shí)的首選工具之一。Feign 是一個(gè)受歡迎的 Java HTTP 客戶端庫(kù),主要用于簡(jiǎn)化服務(wù)間的 HTTP 通信。它通過使用注解來定義 HTTP 請(qǐng)求接口,使得開發(fā)者可以更直觀地調(diào)用遠(yuǎn)程服務(wù)。Feign 提供了可插拔的編碼器解碼器,支持多種數(shù)據(jù)格式,并且可以與 Spring Cloud 集成,方便地實(shí)現(xiàn)負(fù)載均衡和服務(wù)發(fā)現(xiàn)。其簡(jiǎn)潔的 API 和高度的可擴(kuò)展性,使得 Feign 成為微服務(wù)架構(gòu)中常用的工具之一。

二、測(cè)試工程

小傅哥這里給搭建了一套測(cè)試 Feign 案例的六邊形系統(tǒng)架構(gòu);

工程:https://github.com/fuzhengwei/xfg-dev-tech-springcloud-feign

    eureka 模塊,包括;server、client 端,server 端是注冊(cè)中心,用于接收注冊(cè)上來的服務(wù)接口,統(tǒng)一管理負(fù)載。client 端是為了模擬提供一個(gè)服務(wù)接口。你可以任何其他工程來提供 feign 客戶端接口,也就是接口的提供方。這樣消費(fèi)方就可以通過注冊(cè)中心調(diào)用了。infrastructure 是基礎(chǔ)設(shè)施層,在六邊形架構(gòu)中,用于處理調(diào)用外部的接口,內(nèi)部的數(shù)據(jù)庫(kù),緩存等這樣的基礎(chǔ)功能。在 DDD 的軟件設(shè)計(jì)方法中,會(huì)把這部分基礎(chǔ)的東西從功能實(shí)現(xiàn)中拆分出來。domain 和 infrastructure 是依賴倒置關(guān)系,所有 domain 要實(shí)現(xiàn)的服務(wù)需要的基礎(chǔ)數(shù)據(jù),都可以通過依賴倒置方式處理。也就是 domain 領(lǐng)域?qū)佣x接口,之后由基礎(chǔ)設(shè)置層做功能實(shí)現(xiàn)。在通過 Spring 注入到 domain 領(lǐng)域中 service 具體的類中,這樣就可以使用。trigger 名詞為觸發(fā)器,用于承載給外部提供的服務(wù)能力,包括;http接口、rpc接口、job任務(wù)等,這些要調(diào)用我們服務(wù)能力的方式,都可以通過 trigger 層來實(shí)現(xiàn)。

更多的關(guān)于 DDD 六邊形架構(gòu),可以從編程路書中學(xué)習(xí);https://bugstack.cn/md/road-map/ddd-guide-03.html

三、功能實(shí)現(xiàn)

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>
    在官網(wǎng)中有對(duì)應(yīng)版本關(guān)系可以參考:https://spring.io/projects/spring-cloud

2. eureka-server

在公司中 eureka-server 是統(tǒng)一一套的,我們個(gè)人學(xué)習(xí)需要搭建一個(gè)這樣的工程。

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 配置信息。這個(gè)端口 7397 后面其他的客戶端調(diào)用就連接這個(gè)端口。
2.2 啟動(dòng)類
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/
    模擬啟動(dòng)一個(gè)客戶端接口,并填寫注冊(cè)中心地址。
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 小傅哥,微信公眾號(hào):bugstack蟲洞棧?|?"?+?userId?+?"?>:?from?eureka?client?port:?"?+?port;
????}

}
    • 添加一個(gè)客戶端的接口,這里需要注意的是添加了一個(gè)

@EnableEurekaClient

    注解。這樣這個(gè)接口就可以被 eureka 注冊(cè)中心管理。如果你有學(xué)習(xí)過小傅哥的API網(wǎng)關(guān)項(xiàng)目,那么就可以了解這樣的設(shè)計(jì),是如何完成接口注冊(cè)的。

4. 接口使用 - infrastructure

在工程的基礎(chǔ)設(shè)置層配置對(duì)外部的接口調(diào)用;

如果沒有 fegin 我們最開始調(diào)用外部的 http 接口時(shí)候,就需要寫很多的關(guān)于 http 的調(diào)用,這個(gè)過程是比較復(fù)雜的。在使用 feign 后,這個(gè)事就變得簡(jiǎn)單了,同時(shí)還增加了負(fù)載和故障遷移的能力。

當(dāng)然現(xiàn)在調(diào)用http的方式不只是以前的刀耕火種了,可以用 okttp、retrofit2 這樣的框架處理 http 調(diào)用過程。如下這樣的調(diào)用方式也是非常好維護(hù)的。

@GET("cgi-bin/token")
Call<WeixinTokenRes>?getToken(@Query("grant_type")?String?grantType,
@Query("appid")?String?appId,
@Query("secret")?String?appSecret);

四、測(cè)試驗(yàn)證

1. eureka 啟動(dòng)

    分別啟動(dòng) eureka 的服務(wù)端和測(cè)試的客戶端,提供接口能力。啟動(dòng)后訪問 eureka 服務(wù)端:http://127.0.0.1:7397/

2. 測(cè)試工程啟動(dòng)

fuzhengwei@MacBook-Pro?xfg-dev-tech-springcloud-feign?%?curl?http://127.0.0.1:8091/api/v1/query_user_info
Hi 小傅哥,微信公眾號(hào):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
    • 啟動(dòng)應(yīng)用測(cè)試工程,啟動(dòng)后可以訪問驗(yàn)證。驗(yàn)證接口:

http://127.0.0.1:8091/api/v1/query_user_info

 

加入小傅哥的星球「碼農(nóng)會(huì)鎖」,斬獲大廠Offer!閱讀500+份簡(jiǎn)歷和評(píng)審,學(xué)習(xí)6個(gè)業(yè)務(wù)項(xiàng)目;MVC+DDD,雙架構(gòu)開發(fā)小型電商、大營(yíng)銷(超級(jí)大課)、OpenAI 大模型應(yīng)用、Lottery、IM、AI 問答助手。7個(gè)組件項(xiàng)目;OpenAI 代碼評(píng)審、BCP 透視業(yè)務(wù)監(jiān)控、動(dòng)態(tài)線程池、支付SDK設(shè)計(jì)和開發(fā)、API網(wǎng)關(guān)、SpringBoot StarterIDEA Plugin 插件開發(fā)。1套源碼課程、1套基礎(chǔ)教程、1到云服務(wù)器教程以及各類場(chǎng)景解決方案。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者小傅哥多年從事一線互聯(lián)網(wǎng)Java開發(fā),從19年開始編寫工作和學(xué)習(xí)歷程的技術(shù)匯總,旨在為大家提供一個(gè)較清晰詳細(xì)的核心技能學(xué)習(xí)文檔。如果本文能為您提供幫助,請(qǐng)給予支持(關(guān)注、點(diǎn)贊、分享)!