一、前言
本文為spring cloud 微服務框架專題的第二篇,主要講解如何快速搭建微服務以及如何注冊。 本文理論不多,主要是傻瓜式的環境搭建,適合新手快速入門。
為了更好的懂得原理,大家可以下載《spring cloud 和docker微服務架構實戰》pdf得書籍 鏈接: https://pan.baidu.com/s/1LLSqy0QGOhFei-5XJ2HVSA 密碼: d2x7
如果這個鏈接失效了,大家可以聯系我的郵箱,我會很快回復並把pdf發送給您, 郵箱地址 xinyudai_ifox@163.com
本教程代碼地址為 https://github.com/daixiaoyu/springcloud-example-feign,大家可以下載下來運行
代碼說明:為了力求真實開發實戰,沒有將注冊中心,微服務,網關三個項目合在一個module中,而是拆分了,所以引入到idea中時請開三個idea分別引入
二、准備環境
maven(將maven配置到環境變量中,便於后期打包)、 如果需要源碼請安裝git、jdk 、*需要運行第一篇專題的注冊中心*
由於此微服務的暴露是基於Feign的思想的,如果大家沒有這方面的知識可以先查看pdf中關於feign的講解,或者閱讀其他博客,我后面的專題會專門講解Feign
三、搭建和注冊微服務
- 將源碼中的provider模塊導入到Idea中,如果沒有源碼則可可以按照接下來的思路自己搭建,目錄結構為下
可以看到provider中有兩個模塊,分別為cloud-provider 和cloud-provider-api,從命名上大概就可以清晰的看到,api模塊只是
微服務需要向調用方提供的api接口,實際開發中,我們會將此模塊打包到私服,而調用方可以通過Feign像調用本地方法一樣
調用provier的真正實現,入參和返回值全實現了序列化接口並在api中定義
- 編寫api模塊,api模塊沒有任何的技術棧,是單純的java Bean和接口規范,是為了給客戶端約束調用參數和返回值的,我們來
大家可以看到,規范的寫法是,一個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服務
- 接下來我們來看看provider模塊(api的具體實現),是一個提供了http接口的服務,我們先看看他的pom
<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; } }
- 服務都已經搭建完成了,其實很簡單,就是往常的服務器和接口實現,1、只是注冊到了注冊中心,讓其他調用者不用顯示的指定ip和端口(注冊中心會維護和管理)2、對外提供了api的接口,這里其實和web service的思想差不多
- 接下來我們運行 Spring boot 的啟動類(常規的,前提是注冊中心已經運行)
我們就可以看見我們的服務已經注冊到了注冊中心,服務名,唯一服務id都已經指定,實際上在注冊中心還保存了當前服務的ip地址端口號等信息。
下一篇我將編寫遠程的服務調用方,如果通過服務提供的api包就可以像調本地方法一樣調用遠程的服務,文章寫得比較粗糙,我會不斷優化和改進
謝謝大家,如果有哪里不明白的,或者運行不了我的源碼項目的,可以給我發送郵件 xinyudai_ifox@163.com