Eureka入門教程
? 一如碼農(nóng)深似海,今朝有酒今朝醉。入坑已經(jīng)五年多了,人總有所堅持,立個flag,想把spring、springboot、springcloud從入門教程到源碼分析,希望能對于讀者有用,ekko寫文章喜歡詳盡,源代碼有點多,不喜勿噴。
環(huán)境搭建
- IDEA(個人推薦,功能強大不多說)、其次Spring Tools 4,工作這么多年,很大牛用這工具,也是不錯的選擇;其次eclipse。
- jdk1.8環(huán)境。(google或者百度)
- maven(gradle少部分公司用,暫不介紹,當(dāng)然,gradle更強大)
版本
參考官方https://spring.io/projects/spring-cloud
| spring cloud版本 | springboot版本 |
|---|---|
| Hoxton | 2.2.x |
| Greenwich | 2.1.x |
| Finchley | 2.0.x |
| Edgware | 1.5.x |
| Dalston | 1.5.x |
我選擇spring cloud Hoxton.SR4、springboot版本2.2.5.RELEASE。(如果是公司項目建議用老版本,原因無它,坑少網(wǎng)上解決辦法多)。
父級pom.xml文件
<?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.duoduo</groupId>
<artifactId>duoduo-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>duoduo-parent</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
<modules>
<module>duoduo-eureka</module>
<module>duoduo-provider-service</module>
</modules>
</project>
duoduo-eureka子項目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">
<parent>
<artifactId>duoduo-parent</artifactId>
<groupId>com.duoduo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>duoduo-eureka</artifactId>
<dependencies>
<!--eureka-server服務(wù)端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
eureka啟動類
package com.duoduo.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author ekko
* eureka啟動類
*/
@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class,args);
// 官方文檔,編譯報錯,編譯報錯,可以使用下面代碼,個人還是喜歡上面那行代碼,啟動
//new SpringApplicationBuilder(ServerApplication.class)
.web(true).run(args);
//new SpringApplicationBuilder(ServerApplication.class)
.web(WebApplicationType.SERVLET).run(args);
}
}
application.yml文件
server:
port: 8761 #端口
eureka:
instance:
hostname: localhost #eureka服務(wù)端的實例名稱
client:
registerWithEureka: false #false表示不向注冊中心注冊自己。
fetchRegistry: false #false表示自己端就是注冊中心,我的職責(zé)就是維護(hù)服務(wù)實例,并不需要去檢索服務(wù)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊服務(wù)都需要依賴這個地址。
ServerApplication方法啟動
2020-05-23 14:49:39.025 INFO 8031 --- [ Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl : Renew threshold is: 1
2020-05-23 14:49:39.025 INFO 8031 --- [ Thread-17] c.n.e.r.PeerAwareInstanceRegistryImpl : Changing status to UP
2020-05-23 14:49:39.042 INFO 8031 --- [ Thread-17] e.s.EurekaServerInitializerConfiguration : Started Eureka Server
2020-05-23 14:49:39.112 INFO 8031 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8761 (http) with context path ''
2020-05-23 14:49:39.114 INFO 8031 --- [ restartedMain] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8761
控制臺顯示以上信息說明,eureka服務(wù)端啟動成功??梢栽L問http://localhost:8761/。
duoduo-provider-service 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">
<parent>
<artifactId>duoduo-parent</artifactId>
<groupId>com.duoduo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>duoduo-provider-service</artifactId>
<dependencies>
<!--eureka-server服務(wù)端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
啟動類
package com.duoduo.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ekko 不需要添加@EnableEurekaClient,后續(xù)有說明
* eureka啟動類
*/
@SpringBootApplication
@RestController
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class,args);
}
@RequestMapping("/")
public String home() {
return "Hello world";
}
}
application.yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
spring:
application:
name: DUODUO-PROVIDER-SERVICE # 項目服務(wù)名,如果不寫服務(wù)名,默認(rèn)服務(wù)名UNKNOWN
啟動ServiceApplication方法。在訪問http://localhost:8761/,會發(fā)現(xiàn)eureka控制臺Instances currently registered with Eureka多了一個DUODUO-PROVIDER-SERVICE的服務(wù)。
可能遇到問題
-
eureka自我保護(hù)機制(不用看到控制臺保紅就認(rèn)為eureka出問題了)
不知道廣大讀者有沒有了解過CAP模型,eureka是典型AP模型,這里提一句題外話,zookeeper是典型的CP模型,在eureka server運行期間,會統(tǒng)計客戶端心跳的比例,15分鐘是否超過85%,超過則把會把實例注冊信息保護(hù)起來。再說一嘴zookeeper,在zk集群中,網(wǎng)絡(luò)出現(xiàn)問題,zk重新選舉leader,需要耗費不少的時間,這個期間,不可以zk注冊服務(wù),而eureka不同,可以繼續(xù)注冊。原因說這么多,面試官經(jīng)常會問zk、eureka的區(qū)別。這就是這道題的痛點吧。