1. 程式人生 > >SpringCloud學習筆記之Eureka

SpringCloud學習筆記之Eureka

repos tin hostname 服務提供者 spring sna instance figure args

一. 寫在前面

   Spring Cloud及微服務的概念最近被炒得很火。準備把學習了解到的這些東西記錄下。主要還是參考網絡上的一些前輩寫好的博客和資料。目的更多的也只是作為個人的備忘錄及記錄下學習的歷程。開發工具選擇了Idea,依賴管理工具用的是maven。Spring Cloud各組件版本我會多可能或多做一些嘗試,主要做到依賴版本不沖突就好了。

二. 創建服務註冊中心

   看標題其實可以知道,我們這一章主要講的就是服務註冊發現。廢話不多說,直接看看怎麽做。

2.1 創建一個maven項目

   先記下要引入的依賴:使用spring-boot-starter-parent作為父項目,引入spring-boot-starter-test作為測試框架。
<?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>

    <groupId>com.zqx</groupId>
    <artifactId>eurekaregistry</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>springcloud-chapter1</name>
    <description>Demo project for SpringCloud</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <modules>
        <module>eureka-server</module>
        <module>eureka-client</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

對於這個pom說明下:
首先,有幾個對我來說之前不太熟的maven知識點,記錄下怎麽查他們的概念和用法的:
dependencyManagement 參考:https://blog.csdn.net/OiteBody/article/details/70882940
parent標簽 參考:https://blog.csdn.net/yeguxin/article/details/77109725
引入spring-boot-starter-parent有什麽用 參考:https://blog.csdn.net/qq_35981283/article/details/77802771
哪spring-boot-starter-test呢 https://www.cnblogs.com/chenergougou/p/6834336.html
其次,看到這裏有兩個module。說明後面我們會搞兩個子項目。一個作為服務註冊中心(eureka-server),一個作為服務提供者(eureka-client)。以後以上pom就作為公共的父pom,
其他的子項目都引入他。

2.2 創建一個子項目

右擊工程 =》New =》Module。

技術分享圖片

按照之前父pom裏定義的module填寫子項目名:
技術分享圖片
選擇eureka-server作為服務註冊發現組件:
技術分享圖片
做完之後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>

    <groupId>com.zqx</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

可以看到,這裏從父項目裏自動帶過來了很多東西。主要就只是自動加了spring-cloud-starter-netflix-eureka-server這個依賴。所以,其實我們可以精簡一下。很多從父pom裏帶過來的東西其實是重復的。精簡後的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>

    <groupId>com.zqx</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Demo project for eureka-server</description>

    <parent>
        <groupId>com.zqx</groupId>
        <artifactId>eurekaregistry</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>



</project>

2.3 配置啟動一個服務註冊中心

這裏主要就兩步,一是啟動類加上@EnableEurekaServer註解

package com.zqx.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

二是創建配置文件application.yml並配置好一些基礎的屬性。

server:
  port: 6666
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
  application:
    name: eureka-server

一般情況下,一個eureka-server默認也是一個eureka-client。所以,我們設置register-with-eureka=false 讓其不向服務註冊中心註冊自己。fetch-registry=false設置不檢索服務。按我理解,一般來說只有服務註冊中心這個特殊的服務這樣配置,其他服務都默認為true。

2.4 啟動服務註冊中心

到這裏其實,我們就可以啟動服務註冊中心看下效果了:
技術分享圖片
發現其實目前為止,我們沒有任何服務註冊上去。所以,接下來我們要做的就是把eureka-client這個服務註冊上去。

三. 創建一個服務提供者並註冊到服務註冊中心

3.1 再次創建一個子項目

這裏其實和前面差不多,也是創建子module的步驟。弄完之後的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>

    <groupId>com.zqx</groupId>
    <artifactId>eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-client</name>
    <description>Demo project for eureka-client</description>

    <parent>
        <groupId>com.zqx</groupId>
        <artifactId>eurekaregistry</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

可以看到其實就多了一個spring-boot-starter-web,這個東西是幹啥的呢?參考:https://www.cnblogs.com/sherrykid/p/6419620.html
在我看來,作用其實和SpringMVC差不多。就是換了一種引入方式,比以前更方便了而已。後面會用到一些這裏面提供的註解。

3.2 配置啟動一個服務提供者

主要有3步,一啟動類加上@EnableEurekaClient註解;二啟動類直接加個@RestController方法,並實現一個服務方法,這裏暫時就不考慮什麽分層的問題了,主要還是為了演示;三就還是創建配置application.yml並配置好一些基礎屬性了。如下,

package com.zqx.eurekaclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {

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

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name",defaultValue = "zqx") String name){
        return "hi "+name+",i am from port:"+port;
    }

}
server:
  port: 6667
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://localhost:6666/eureka/
spring:
  application:
    name: eureka-client

3.3 啟動服務

此時就已經可以啟動這個服務,查看效果了。
技術分享圖片
可以看到現在的服務列表裏面已經有一個服務了,且我們可以直接用瀏覽器請求訪問這個服務提供的方法url,測試下方法的效果:
技術分享圖片

四. 主要參考

https://blog.csdn.net/forezp/article/details/81040925

SpringCloud學習筆記之Eureka