SpringCloud核心教程 | 第三篇:服務註冊與發現 Eureka篇

Spring Cloud簡介

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud包含了多個子項目(針對分佈式系統中涉及的多個不同開源產品),比如:Spring Cloud ConfigSpring Cloud NetflixSpring Cloud CloudFoundrySpring Cloud AWSSpring Cloud SecuritySpring Cloud CommonsSpring Cloud ZookeeperSpring Cloud CLI等項目。

微服務架構

“微服務架構”在這幾年非常的火熱,以至於關於微服務架構相關的開源產品被反覆的提及(比如: netflixdubbo),Spring Cloud也因Spring社區的強大知名度和影響力也被廣大架構師與開發者備受關注。

那麼什麼是“微服務架構”呢?簡單的說,微服務架構就是將一個完整的應用從數據存儲開始垂直拆分成多個不同的服務,每個服務都能獨立部署、獨立維護、獨立擴展,服務與服務間通過諸如RESTful API的方式互相調用。

對於“微服務架構”,大家在互聯網可以搜索到很多相關的介紹和研究文章來進行學習和了解。也可以閱讀始祖Martin Fowler的《Microservices》(中文版翻譯點擊查看),本文不做更多的介紹和描述。

服務治理

在簡單介紹了Spring Cloud和微服務架構之後,下面迴歸本文的主旨內容,如何使用Spring Cloud來實現服務治理。

由於Spring Cloud爲服務治理做了一層抽象接口,所以在Spring Cloud應用中可以支持多種不同的服務治理框架,比如:Netflix EurekaConsulZookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實現,並且不影響任何其他的服務註冊、服務發現、服務調用等邏輯。

所以,下面我們通過Eureka這種種服務治理的實現來體會Spring Cloud這一層抽象所帶來的好處。
下一篇介紹基於Consul的服務註冊與調用。

Spring Cloud Eureka

首先,我們來嘗試使用Spring Cloud Eureka來實現服務治理。

Spring Cloud EurekaSpring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內容是對Netflix公司一系列開源產品的包裝,它爲Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模塊並構建龐大的分佈式系統。它主要提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。

下面,就來具體看看如何使用Spring Cloud Eureka實現服務治理,這裏使用eureka-server爲服務註冊中心工程、eureka-provider服務提供者工程、eureka-consumer服務消費者工程。

準備工作

環境:

windows
jdk 8
maven 3.0
IDEA

構建工程

首先構建父工程,引入父工程依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>cn.zhangbox</groupId>
        <artifactId>spring-cloud-study</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    
    <groupId>cn.zhangbox</groupId>
    <artifactId>spring-cloud-eureka</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    
    <!--子模塊-->
    <modules>
        <module>eureka-server</module>
        <module>eureka-provider</module>
        <module>eureka-consumer</module>
    </modules>
    
</project>

父工程取名爲:spring-cloud-eureka
構建子工程,分別創建工程名爲:eureka-servereureka-providereureka-consumer並在pom中加入以下依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>cn.zhangbox</groupId>
        <artifactId>spring-cloud-eureka</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.zhangbox</groupId>
    <artifactId>eureka-server</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Spring Cloud In Action</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入eureka服務端依賴start -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!-- 引入eureka服務端依賴end -->
    </dependencies>

    <!-- 添加cloud 依賴start -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 添加cloud 依賴end -->

    <!-- 添加maven構建插件start -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <!-- 添加maven構建插件end -->

</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>cn.zhangbox</groupId>
        <artifactId>spring-cloud-eureka</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.zhangbox</groupId>
    <artifactId>eureka-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-provider</name>
    <description>this project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- 版本控制 -->
        <commons-lang3.version>3.4</commons-lang3.version>
        <commons-codec.version>1.10</commons-codec.version>
        <mybatis-spring-boot.version>1.2.0</mybatis-spring-boot.version>
        <lombok.version>1.16.14</lombok.version>
        <fastjson.version>1.2.41</fastjson.version>
        <druid.version>1.1.2</druid.version>
    </properties>

    <repositories>
        <!-- 阿里私服 -->
        <repository>
            <id>aliyunmaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>

        <!-- mybatis核心包 start -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot.version}</version>
        </dependency>
        <!-- mybatis核心包 end -->

        <!-- 添加eureka支持start -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- 添加eureka支持start -->

        <!-- SpringWEB核心包 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringWEB核心包 end -->

        <!-- Swagger核心包 start -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!-- Swagger核心包 end -->

        <!-- mysql驅動核心包 start -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- mysql驅動核心包 end -->

        <!-- sprigTest核心包 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- sprigTest核心包 end -->

        <!-- commons工具核心包 start -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons-codec.version}</version>
        </dependency>
        <!-- commons工具核心包 end -->

        <!-- fastjson核心包 start -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- fastjson核心包 end -->

        <!-- druid核心包 start -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- druid核心包 end -->

        <!-- lombok核心包 start -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!-- lombok核心包 end -->
    </dependencies>

    <!-- 添加cloud 依賴start -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 添加cloud 依賴end -->

    <build>
        <finalName>eureka-provider</finalName>
        <plugins>
            <!-- 添加maven構建插件start -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 添加maven構建插件end -->
        </plugins>
    </build>

</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>cn.zhangbox</groupId>
        <artifactId>spring-cloud-eureka</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>cn.zhangbox</groupId>
    <artifactId>eureka-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-consumer</name>
    <description>this project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!-- 版本控制 -->
        <commons-lang3.version>3.4</commons-lang3.version>
        <commons-codec.version>1.10</commons-codec.version>
        <mybatis-spring-boot.version>1.2.0</mybatis-spring-boot.version>
        <lombok.version>1.16.14</lombok.version>
        <fastjson.version>1.2.41</fastjson.version>
        <druid.version>1.1.2</druid.version>
    </properties>

    <repositories>
        <!-- 阿里私服 -->
        <repository>
            <id>aliyunmaven</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- 添加eureka支持start -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- 添加eureka支持start -->

        <!-- 添加feign支持start -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>
        <!-- 添加feign支持end -->

        <!-- SpringWEB核心包 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringWEB核心包 end -->

        <!-- Swagger核心包 start -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!-- Swagger核心包 end -->

        <!-- sprigTest核心包 start -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- sprigTest核心包 end -->

        <!-- commons工具核心包 start -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>${commons-codec.version}</version>
        </dependency>
        <!-- commons工具核心包 end -->

        <!-- fastjson核心包 start -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <!-- fastjson核心包 end -->

        <!-- lombok核心包 start -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!-- lombok核心包 end -->
    </dependencies>

    <!-- 添加cloud 依賴start -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!-- 添加cloud 依賴end -->

    <build>
        <finalName>eureka-provider</finalName>
        <plugins>
            <!-- 添加maven構建插件start -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 添加maven構建插件end -->
        </plugins>
    </build>

</project>

工程構建完成。

服務註冊中心工程配置

首先:eureka-server工程下resource目錄下添加application.yml文件並加入以下配置:

#工程名稱
spring:
  application:
    name: eureka-server
#選擇哪一個環境的配置
#這裏可以在每個環境配置redis,數據庫(mysql),消息(kafka)等相關的組件的配置
  profiles:
    active: dev
#配置eureka註冊中心
eureka:
  #server:
    #配置關閉自我保護模式
    #enableSelfPreservation: false
    #配置Eureka Server清理無效節點的時間間隔
    #eviction-interval-timer-in-ms: 4000
  instance:
    #配置與此實例相關聯的主機名,是其他實例可以用來進行請求的準確名稱
    hostname: eureka-server
    #顯示服務ip地址
    preferIpAddress: true
    #獲取服務的ip和端口
    instanceId: ${spring.cloud.client.ipAddress}:${server.port}
  client:
    #配置不將自己註冊到eureka註冊中心
    register-with-eureka: false
    #配置此客戶端不獲取eureka服務器註冊表上的註冊信息
    fetch-registry: false
    serviceUrl:
          #配置默認節點有信息,這裏是獲取本機的ip和端口來實現,如果不配置,默認會找8761端口,這裏配置的是1001端口,因此會報錯
          defaultZone: http://${spring.cloud.client.ipAddress}:${server.port}/eureka/
      
#文檔塊區分爲三個---
---
server:
  port: 1001
spring:
  profiles: dev
#日誌
logging:
  config: classpath:log/logback.xml
  path: log/eureka-server

#文檔塊區分爲三個---
---
server:
  port: 1002
spring:
  profiles: test
#日誌
logging:
  config: classpath:log/logback.xml
  path: usr/eureka-server/log/eureka-server

#文檔塊區分爲三個---
---
server:
  port: 1003
spring:
  profiles: prod
#日誌
logging:
  config: classpath:log/logback.xml
  path: usr/eureka-server/log/eureka-server

這裏日誌的配置不在詳細說明,不知道怎麼配置可以參考這篇文章:
SpringBoot進階教程 | 第二篇:日誌組件logback實現日誌分級打印

其次:創建核心啓動類:

@EnableEurekaServer//加上此註解表示將此工程啓動後爲註冊中心
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
    }

}

最後:啓動項目
至此eureka註冊中心創建完成,瀏覽器輸入地址:http://localhost:1001/
可以看到如下頁面,表示服務啓動OK
圖片.png
這裏這看到還沒有服務暴露出來,是因爲還沒創建服務提供者工程。

服務提供者工程配置

這裏服務提供者是使用之前SpringBoot進階教程 | 第三篇:整合Druid連接池以及Druid監控改造而來,這裏一樣的部分就不再重複說明,下面將說明新增的部分。
首先:修改application.yml配置爲如下:

#公共配置
server:
    port: 80
    tomcat:
      uri-encoding: UTF-8
spring:
  application:
      #服務名稱,更關鍵,使用feign進行服務消費將以此爲依據
      name: eureka-provider
  #激活哪一個環境的配置文件
  profiles:
    active: dev
  #連接池配置
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    # 使用druid數據源
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      # 配置測試查詢語句
      validationQuery: SELECT 1 FROM DUAL
      # 初始化大小,最小,最大
      initialSize: 10
      minIdle: 10
      maxActive: 200
      # 配置一個連接在池中最小生存的時間,單位是毫秒
      minEvictableIdleTimeMillis: 180000
      testOnBorrow: false
      testWhileIdle: true
      removeAbandoned: true
      removeAbandonedTimeout: 1800
      logAbandoned: true
      # 打開PSCache,並且指定每個連接上PSCache的大小
      poolPreparedStatements: true
      maxOpenPreparedStatements: 100
      # 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
      filters: stat,wall,log4j
      # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

#配置eureka獲取服務地址,這裏使用的是本地註冊中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1001/eureka/
  #配置Swagger相關信息
  instance:
      prefer-ip-address: true
      instanceId: ${spring.cloud.client.ipAddress}:${server.port}
      status-page-url: http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html # ${server.port}爲該服務的端口號

#mybatis
mybatis:
  # 實體類掃描
  type-aliases-package: cn.zhangbox.springboot.entity
  # 配置映射文件位置
  mapper-locations: classpath:mapper/*.xml
  # 開啓駝峯匹配
  mapUnderscoreToCamelCase: true

---
#開發環境配置
server:
  #端口
  port: 8080
spring:
  profiles: dev
  # 數據源配置
  datasource:
    url: jdbc:mysql://101.132.66.175:3306/student?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
    username: root
    password: 123456
#日誌
logging:
  config: classpath:log/logback.xml
  path: log/eureka-provider

---
#測試環境配置
server:
  #端口
  port: 80
spring:
  profiles: test
  # 數據源配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/eureka-provider?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
    username: root
    password: 123456
#日誌
logging:
  config: classpath:log/logback.xml
  path: /home/log/eureka-provider

---
#生產環境配置
server:
  #端口
  port: 8080
spring:
  profiles: prod
  # 數據源配置
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/eureka-provider?useUnicode=true&characterEncoding=utf8&useSSL=false&tinyInt1isBit=true
    username: root
    password: 123456
#日誌
logging:
  config: classpath:log/logback.xml
  path: /home/log/eureka-provider

其次:config目錄下增加SwaggerConfig類加入以下代碼:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket userApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.zhangbox.eureka.provider.controller"))//過濾的接口,有這掃描纔會看到接口信息
                .paths(PathSelectors.any())
                .build();
        return docket;
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("eureka服務端提供者接口平臺").description("服務相關數據接口")
                .termsOfServiceUrl("http://www.zhang.box.cn/").contact("技術開發部")
                .license("Licence Version 1.0").licenseUrl("#").version("1.0").build();
    }

}

這裏如果不會使用swagger的整合可以參考這篇文章:
SpringBoot非官方教程 | 第十一篇:SpringBoot集成swagger2,構建優雅的Restful API

接着:創建核心啓動類:

@EnableDiscoveryClient //使用該註解將註冊服務到eureka
@SpringBootApplication
@MapperScan("cn.zhangbox.eureka.provider.dao")//配置mybatis接口包掃描
public class EurekaProviderApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }
}

最後:啓動項目
至此eureka-provider服務提供者創建完成,瀏覽器輸入地址:http://localhost:1001/
可以看到如下頁面,表示服務註冊OK
圖片.png
點擊Status下的ip後可以跳轉看到swagger的頁面並可是測試服務提供者的接口,如下:
圖片.png

服務消費者工程配置

這裏構建的工程名爲eureka-consumer,上文已經構建了工程但是沒有創建目錄,這裏只需要在java目錄下創建configcontrollerservice,包即可,這裏服務的消費是通過feign來進行服務調用的,後面會有專門以篇文章來講feign
首先:eureka-consumer工程下resource目錄下添加application.yml文件並加入以下配置:

#公共配置
server:
    port: 80
    tomcat:
      uri-encoding: UTF-8
spring:
  #服務名稱,更關鍵,使用feign進行服務消費將以此爲依據
  application:
     name: eureka-consumer
  #激活哪一個環境的配置文件
  profiles:
    active: dev

#配置eureka獲取服務地址,這裏使用的是本地註冊中心
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1001/eureka/
  #配置instance相關信息
  instance:
      prefer-ip-address: true
      instanceId: ${spring.cloud.client.ipAddress}:${server.port}
      status-page-url: http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html # ${server.port}爲該服務的端口號

---
#開發環境配置
server:
  #端口
  port: 8081
spring:
  profiles: dev
#日誌
logging:
  config: classpath:log/logback.xml
  path: log/eureka-consumer

---
#測試環境配置
server:
  #端口
  port: 8082
spring:
  profiles: test
#日誌
logging:
  config: classpath:log/logback.xml
  path: /home/log/eureka-consumer

---
#生產環境配置
server:
  #端口
  port: 8083
spring:
  profiles: prod
#日誌
logging:
  config: classpath:log/logback.xml
  path: /home/log/eureka-consumer

其次:config目錄下增加SwaggerConfig類加入以下代碼:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket userApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("cn.zhangbox.eureka.consumer.controller"))//過濾的接口,有這掃描纔會看到接口信息
                .paths(PathSelectors.any())
                .build();
        return docket;
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title("eureka服務端消費者接口平臺").description("服務相關數據接口")
                .termsOfServiceUrl("http://www.zhang.box.cn/").contact("技術開發部")
                .license("Licence Version 1.0").licenseUrl("#").version("1.0").build();
    }

}

接着:service包下創建StudentConsumerService類並加入以下代碼:

@FeignClient(value = "eureka-provider")
public interface StudentConsumerService {

    /**
     * 查詢所有的學生信息
     *
     * @param sname
     * @param age
     * @return
     */
    @RequestMapping(value = "/student/list",method = RequestMethod.GET)
    String getStudentList(@RequestParam(value = "sname") String sname, @RequestParam(value = "age") Integer age);
}

然後:controller包下創建StudentConteroller並加入如下代碼:

@Controller
@RequestMapping("/student")
@Api(value = "eureka-consumer", description = "學生查詢接口")
public class StudentConteroller {
    private static final Logger LOGGER = LoggerFactory.getLogger(StudentConteroller.class);

    @Autowired
    StudentConsumerService studentService;

    /**
     * 查詢所有的學生信息
     *
     * @param sname
     * @param age
     * @param modelMap
     * @return
     */
    @ResponseBody
    @GetMapping("/consumer/list")
    public String list(
            @ApiParam(value = "學生姓名") @RequestParam(required = false) String sname,
            @ApiParam(value = "年齡") @RequestParam(required = false) Integer age,
            ModelMap modelMap) {
        String json = null;
        try {
            json = studentService.getStudentList(sname, age);
        } catch (Exception e) {
            e.printStackTrace();
            modelMap.put("ren_code", "0");
            modelMap.put("ren_msg", "查詢失敗===>" + e);
            LOGGER.error("查詢失敗===>" + e);
            json = JSON.toJSONString(modelMap);
        }
        return json;
    }
}

接着:創建核心啓動類:

@EnableFeignClients//開啓Feign調用接口
@EnableDiscoveryClient//開啓客戶端服務,沒有這個註解會報Feign找不到對應服務的錯誤
@SpringBootApplication
public class EurekaConsumerApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }
}

最後:啓動項目
至此eureka-consumer服務提供者創建完成,瀏覽器輸入地址:http://127.0.0.1:8081/swagger-ui.html
同樣也可以點擊eureka控制檯中ApplicationEUREKA-CONSUMERStatus下的ip後可以跳轉看到swagger的頁面並可是測試服務消費者的接口,可以看到如下頁面,並點擊try it out按鈕,返回了正確的學生信息數據
圖片.png
返回數據如下:
圖片.png

{
    "ren_code": "0",
    "ren_msg": "查詢成功",
    "studentList": [{
        "age": "17",
        "birth": "2010-07-22",
        "dept": "王同學學習成績很不錯",
        "sex": "1",
        "sname": "王同學",
        "sno": 1
    }, {
        "age": "17",
        "birth": "2010-07-22",
        "dept": "李同學學習成績很不錯",
        "sex": "1",
        "sname": "李同學",
        "sno": 2
    }]
}

以上就是spring cloud基於eurka實現分佈式服務註冊與消費的整合流程,是不是很簡單,你也來小試牛刀一把吧。

寫在最後

歡迎關注喜歡、和點贊後續將推出更多的spring cloud教程,敬請期待。

源碼地址

SpringCloud核心教程 | 第三篇:服務註冊與發現 Eureka篇

歡迎關注我的微信公衆號獲取更多更全的學習資源,視頻資料,技術乾貨!
歡迎掃碼關注

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章