javascript
SpringCloud组件:Eureka的服务发现与消费
在之前的章節我們已經把服務注冊到Eureka Server,那么我們該怎么調用已經注冊后的服務呢? 我們本章來簡單的介紹我們具體該怎么調用服務節點請求內容。
本章目標
消費Eureka注冊的服務節點的請求信息。
構建項目
我們只需要創建一個服務節點項目即可,因為服務提供者也是消費者,然后將本項目注冊到之前編寫的服務注冊中心,下載文章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);/*** 注入服務客戶端實例*/@Autowiredprivate DiscoveryClient discoveryClient;/*** 注入restTemplate模板*/@Autowiredprivate 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。
運行測試
我們的測試流程如下:
訪問有多種形式,你可以瀏覽器直接訪問地址,我通過curl命令來訪問地址,打開terminal輸入以下命令:
curl http://localhost:20002/consumer/index 復制代碼請求正常,查看控制臺輸出內容如下所示:
2018-10-04 15:23:36.333 INFO 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.748 INFO 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…
總結
以上是生活随笔為你收集整理的SpringCloud组件:Eureka的服务发现与消费的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: react使用引入svg的icon;sv
- 下一篇: 前序遍历(递归、非递归)、层序遍历(递归