SpringCloud學習筆記之Eureka
一. 寫在前面
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