1、前言java
本文爲spring cloud 微服務框架專題的第二篇,主要講解如何快速搭建微服務以及如何註冊。 本文理論很少,主要是傻瓜式的環境搭建,適合新手快速入門。node
爲了更好的懂得原理,你們能夠下載《spring cloud 和docker微服務架構實戰》pdf得書籍 連接: https://pan.baidu.com/s/1LLSqy0QGOhFei-5XJ2HVSA 密碼: d2x7git
若是這個連接失效了,你們能夠聯繫個人郵箱,我會很快回復並把pdf發送給您, 郵箱地址 xinyudai_ifox@163.comgithub
本教程代碼地址爲 https://github.com/daixiaoyu/springcloud-example-feign,你們能夠下載下來運行web
代碼說明:爲了力求真實開發實戰,沒有將註冊中心,微服務,網關三個項目合在一個module中,而是拆分了,因此引入到idea中時請開三個idea分別引入spring
2、準備環境docker
maven(將maven配置到環境變量中,便於後期打包)、 若是須要源碼請安裝git、jdk 、*須要運行第一篇專題的註冊中心*api
因爲此微服務的暴露是基於Feign的思想的,若是你們沒有這方面的知識能夠先查看pdf中關於feign的講解,或者閱讀其餘博客,我後面的專題會專門講解Feign服務器
3、搭建和註冊微服務架構
能夠看到provider中有兩個模塊,分別爲cloud-provider 和cloud-provider-api,從命名上大概就能夠清晰的看到,api模塊只是
微服務須要向調用方提供的api接口,實際開發中,咱們會將此模塊打包到私服,而調用方能夠經過Feign像調用本地方法同樣
調用provier的真正實現,入參和返回值全實現了序列化接口並在api中定義
你們能夠看到,規範的寫法是,一個Rao接口,一個param入參和一個response返回值。接下來咱們來看看Rao接口的定義
package com.dai.cloud.Rao; import com.dai.cloud.param.UserParam; import com.dai.cloud.response.UserResponse; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; /** * @author <a href="mailto:daixinyu@sinoland666.com">代欣雨</a> * @description 服務提供者接口 * @date 2018/1/19 15:54 * @Version V1.0 */ @FeignClient("provider-server") //告訴客戶端,這個接口須要到這個服務中去尋找 @RequestMapping(value = "/provider") public interface ProviderRao { @RequestMapping(value = "/user",method = RequestMethod.POST) UserResponse getUserByParam(@RequestBody UserParam param); }
你們能夠看到,這裏和spring mvc 的實現沒有什麼大的區別,對的,其實就是對外暴露接口而已,提供http服務
<dependencyManagement> spring cloud 的依賴 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <spring mvc的依賴> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <註冊中心的依賴,由於此微服務須要註冊到註冊中心> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <須要實現的api的接口,api> <groupId>com.dai.cloud</groupId> <artifactId>cloud-provicer-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
spring: application: name: provider-server 這裏必須同api中rao接口中的@FeignClient的value值同樣,否則調用方沒法從註冊中心獲取到此服務地址 server: port: 8006 服務端口 eureka: client: service-url: defaultZone: http://localhost:9527/eureka/ 註冊中心地址,此微服務運行起來後會自動註冊到地址 instance: prefer-ip-address: true /將ip配置到註冊中心,實際的調用依然是ip ,http hostname: com.dai.provider.node1.com /當前節點的名稱 instance-id: com.dai.provider.node1.com /當前節點的id 實際開發中,一個微服務會運行多個實例,用於高可用,這兩個配置都是用於區分每一個實例 feign: /這個是Feign的配置,你們能夠暫時不瞭解,或者看pdf的書籍 hystrix: enabled:true
接下來咱們來看看Rao接口的實現
package com.dai.cloud.controller; import com.dai.cloud.Rao.ProviderRao; import com.dai.cloud.param.UserParam; import com.dai.cloud.response.UserResponse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; /** * @author <a href="mailto:daixinyu@sinoland666.com">代欣雨</a> * @description 請填類描述 * @date 2018/1/19 15:51 * @Version V1.0 */ @RestController // spring mvc的註解,將此接口註冊,必須是RestController @Api(tags = "服務提供中心",description ="服務提供中心" ) public class ProviderController implements ProviderRao { // 能夠看到這裏實現了剛纔在api中定義的接口,全部的鏈接地址都繼承了,惟一須要注意的是入參的註解要寫進來(@RequestBody等) @ApiOperation(value = "查詢用戶") @Override public UserResponse getUserByParam(@RequestBody UserParam param) { UserResponse response = new UserResponse(); response.setUserId(param.getUserId()); response.setUserName("代欣雨"); return response; } }
咱們就能夠看見咱們的服務已經註冊到了註冊中心,服務名,惟一服務id都已經指定,實際上在註冊中心還保存了當前服務的ip地址端口號等信息。
下一篇我將編寫遠程的服務調用方,若是經過服務提供的api包就能夠像調本地方法同樣調用遠程的服務,文章寫得比較粗糙,我會不斷優化和改進
謝謝你們,若是有哪裏不明白的,或者運行不了個人源碼項目的,能夠給我發送郵件 xinyudai_ifox@163.com