spring cloud 專題二(spring cloud 入門搭建 之 微服務搭建和註冊)

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模塊導入到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;
    }
}
  • 服務都已經搭建完成了,其實很簡單,就是往常的服務器和接口實現,一、只是註冊到了註冊中心,讓其餘調用者不用顯示的指定ip和端口(註冊中心會維護和管理)二、對外提供了api的接口,這裏其實和web service的思想差很少
  • 接下來咱們運行 Spring boot 的啓動類(常規的,前提是註冊中心已經運行)

           

          咱們就能夠看見咱們的服務已經註冊到了註冊中心,服務名,惟一服務id都已經指定,實際上在註冊中心還保存了當前服務的ip地址端口號等信息。

          下一篇我將編寫遠程的服務調用方,若是經過服務提供的api包就能夠像調本地方法同樣調用遠程的服務,文章寫得比較粗糙,我會不斷優化和改進

          謝謝你們,若是有哪裏不明白的,或者運行不了個人源碼項目的,能夠給我發送郵件 xinyudai_ifox@163.com

相關文章
相關標籤/搜索