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


一、前言

      本文為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

  

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM