SpringCloud元件:Eureka的服務發現與消費
在之前的章節我們已經把服務註冊到Eureka Server
,那麼我們該怎麼呼叫已經註冊後的服務呢?
我們本章來簡單的介紹我們具體該怎麼呼叫服務節點
請求內容。
本章目標
消費Eureka
註冊的服務節點
的請求資訊。
構建專案
我們只需要建立一個服務節點專案
即可,因為服務提供者
也是消費者
,然後將本專案註冊到之前編寫的服務註冊中心
,下載文章ofollow,noindex">SpringCloud元件:搭建Eureka服務註冊中心
原始碼執行即可。
我們使用idea
開發工具建立一個SpringBoot
專案,對應的選擇spring-boot-starter-web
、spring-cloud-starter-netflix-ribbon
、spring-cloud-starter-netflix-eureka-client
三個依賴,pom.xml
配置檔案如下所示:
...... <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties> <dependencies> <!--Web依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <!--client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> ...... 複製程式碼
新增完依賴後我們需要對本專案進行配置,讓本專案註冊到服務中心,在之前的章節SpringCloud元件:將微服務提供者註冊到Eureka服務中心 有講過,這裡就不做過多的贅述。
配置Eureka客戶端
開啟XxxApplication
入口類,新增@EnableDiscoveryClient
註解,如下所示:
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudEurekaConsumerApplication { //... } 複製程式碼
修改application.yml配置檔案
下面我們修改application.yml
配置檔案,新增Eureka Client
對應的配置資訊,如下所示:
# 服務名稱 spring: application: name: hengboy-spring-cloud-eureka-consumer # 啟動埠號 server: port: 20002 # Eureka 服務註冊中心配置 eureka: client: service-url: defaultZone: http://localhost:10000/eureka/ # 配置優先使用IP地址註冊服務 instance: prefer-ip-address: true 複製程式碼
獲取服務例項資訊
如果你只是將服務註冊到服務註冊中心
也就是Eureka Server
上,到現在已經完全沒有問題了,但是我們想要通過服務名
(spring.application.name
)來獲取服務例項列表
該怎麼操作呢?
本章內容涉及一點有關Ribbon
的知識點,我們通過新增依賴spring-cloud-starter-netflix-ribbon
就可以直接使用RestTemplate
類進行傳送http請求
,而且RestTemnplate
可以直接使用服務名
進行傳送請求!!!
例項化RestTemplate
spring-cloud-starter-netflix-ribbon
依賴並沒有為我們例項化RestTemplate
,我們需要手動進行例項化,我採用@Bean
方式進行例項化,在XxxApplication
類內新增如下程式碼:
/** * 例項化RestTemplate物件例項 * * @return */ @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } 複製程式碼
在這裡有個@LoadBalanced
註解,我們後續章節會對它詳細的講解,部落格搜尋關鍵字LoadBalanced
查詢文章資訊,不過如果你不新增並使用這個註解,你是沒有辦法通過服務名
直接傳送請求的,會出現錯誤資訊。
瞭解DiscoveryClient
我們需要建立一個傳送請求
以及請求消費
的Controller
,如下所示:
/** * 消費者控制器 * * @author:於起宇 <p> * ================================ * Created with IDEA. * Date:2018/9/29 * Time:5:55 PM * 簡書:http://www.jianshu.com/u/092df3f77bca * 碼雲:https://gitee.com/hengboy * GitHub:https://github.com/hengyuboy * ================================ * </p> */ @RestController @RequestMapping(value = "/consumer") public class ConsumerController { /** * logger instance */ static Logger logger = LoggerFactory.getLogger(ConsumerController.class); /** * 注入服務客戶端例項 */ @Autowired private DiscoveryClient discoveryClient; /** * 注入restTemplate模板 */ @Autowired private RestTemplate restTemplate; /** * 服務消費者業務邏輯方法 * 該方法使用restTemplate訪問獲取返回資料 * * @return */ @RequestMapping(value = "/logic") public String home() { return "this is home page"; } /** * 請求地址 * 輸出服務的基本資訊 */ @RequestMapping(value = "/index") public void index() { discoveryClient.getInstances("hengboy-spring-cloud-eureka-consumer") .stream() .forEach( instance -> { logger.info("服務地址:{},服務埠號:{},服務例項編號:{},服務地址:{}", instance.getHost(), instance.getPort(), instance.getServiceId(), instance.getUri()); String response = restTemplate.getForEntity("http://" + instance.getServiceId() + "/consumer/logic", String.class).getBody(); logger.info("響應內容:{}", response); } ); } } 複製程式碼
在上面程式碼中我們注入了DiscoveryClient
,這是一個介面類
,具體該介面的實現類是什麼要取決你使用的是什麼服務註冊中心
,我們本章採用的Eureka
理所當然使用的是Eureka
實現類,原始碼可以檢視org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient
,在EurekaDiscoveryClient
內可以看到具體是怎麼通過服務名
獲取例項的列表,部分原始碼如下所示:
@Override public List<ServiceInstance> getInstances(String serviceId) { List<InstanceInfo> infos = this.eurekaClient.getInstancesByVipAddress(serviceId, false); List<ServiceInstance> instances = new ArrayList<>(); for (InstanceInfo info : infos) { instances.add(new EurekaServiceInstance(info)); } return instances; } 複製程式碼
你如果對具體的原始碼執行流程感興趣,可以使用斷點來一步一步的觀察。
在獲取ServiceInstance
服務例項後,可以得到例項的一些基本資訊如:
-
serviceId
:服務名稱、服務的例項編號,也就是spring.application.name
配置資訊 -
host
:註冊該例項的hostName
-
port
:註冊該例項的埠號,對應server.port
配置資訊 -
uri
:服務地址 -
metadata
:服務自定義的元資料map
集合
請求轉發流程
執行流程:我們在訪問/consumer/index
請求地址時,會通過RestTemplate
轉發請求訪問http://hengboy-spring-cloud-eureka-consumer/consumer/logic
地址並返回資訊this is home page
。
執行測試
我們的測試流程如下:
http://localhost:20002/consumer/index this is home page
訪問有多種形式,你可以瀏覽器直接訪問地址,我通過curl
命令來訪問地址,開啟terminal
輸入以下命令:
curl http://localhost:20002/consumer/index 複製程式碼
請求正常,檢視控制檯輸出內容如下所示:
2018-10-04 15:23:36.333INFO 29075 --- [io-20002-exec-5] c.y.c.h.s.e.consumer.ConsumerController: 服務地址:192.168.1.75,服務埠號:20002,服務例項編號:HENGBOY-SPRING-CLOUD-EUREKA-CONSUMER,服務地址:http://192.168.1.75:20002 ...... 2018-10-04 15:23:36.748INFO 29075 --- [io-20002-exec-5] c.y.c.h.s.e.consumer.ConsumerController: 響應內容:this is home page 複製程式碼
總結
本章通過Ribbon
簡單的實現了服務節點的消費,通過RestTemplate
傳送請求來獲取響應內容,需要注意的是我們並不是通過IP
:Port
的形式,而是通過服務名
的形式傳送請求,這都歸功於@LoadBalanced
這個註解,這個註解在講解Ribbon
時會詳細的說明。
原始碼位置
- SpringBoot配套原始碼地址:訪問碼雲檢視原始碼、訪問GitHub檢視原始碼
-
SpringCloud配套原始碼地址(
本章原始碼在這
):訪問碼雲檢視原始碼 ,訪問GitHub檢視原始碼
有問題要問?
如果你有技術相關的問題想要諮詢恆宇少年
,請去部落格首頁左側導航欄,點選知識星球
微信掃碼加入我的星球。
與恆宇少年面對面
如果你喜歡恆宇少年
的相關文章,那麼就去微信公眾號(恆宇少年
)關注我吧!!!
當然你也可以去SpringCloud碼雲原始碼 專案底部掃描微信公眾號二維碼關注我,感謝閱讀!!!
學習目錄推薦
- SpringCloud相關係列文章訪問:www.jianshu.com/p/64e4aaada…
- SpringBoot相關係列文章請訪問:www.jianshu.com/p/9a08417e4…
- QueryDSL相關係列文章請訪問:www.jianshu.com/p/99a5ec5c3…
- SpringDataJPA相關係列文章請訪問:www.jianshu.com/p/615ed9c1f…
開源資訊
這段時間一直在編寫開源的相關框架,致力於公司使用的框架升級以及開源計劃,將公司使用到的工具
以及外掛
進行升級重構並且開源。
-
程式碼生成器(Code-Builder)
code-builder
程式碼生成器根據你提供的模板檔案(目前支援freemarker
)自動生成實體類,可以很大很有效的提高開發效率。Gitee地址
:gitee.com/hengboy/cod…Github地址
:github.com/hengyuboy/c… -
持久化框架(MyBatis-Enhance)
mybatis-enhance
是一個對mybatis
框架的增強封裝,提供一系列的內部方法來完成單表資料的操作,多表資料提供DSL
方式進行操作。Gitee地址
:gitee.com/hengboy/myb…Github地址
:github.com/hengyuboy/m… -
自動分頁外掛
MyBatis-Pageable
是一款自動化分頁的外掛,基於MyBatis
內部的外掛Interceptor
攔截器編寫完成,攔截Executor.query
的兩個過載方法計算出分頁的資訊以及根據配置的資料庫Dialect
自動執行不同的查詢語句完成總數量的統計。Gitee地址
:gitee.com/hengboy/myb…