前言
在這篇文章介紹并記錄如何搭建一個(gè)單節(jié)點(diǎn)Eureka以及高可用的Eureka服務(wù)。
根據(jù)springcloud官方文檔描述
Spring Cloud為開發(fā)人員提供了一些工具來快速構(gòu)建分布式系統(tǒng)中的一些常見模式(例如配置管理、服務(wù)發(fā)現(xiàn)、斷路器、智能路由、微代理、控制總線、一次性令牌、全局鎖、領(lǐng)導(dǎo)層選舉、分布式會(huì)話、群集狀態(tài))。分布式系統(tǒng)的協(xié)調(diào)導(dǎo)致了鍋爐板模式,使用Spring Cloud開發(fā)人員可以快速建立實(shí)現(xiàn)這些模式的服務(wù)和應(yīng)用程序。它們在任何分布式環(huán)境中都能很好地工作,包括開發(fā)人員自己的筆記本電腦、裸機(jī)數(shù)據(jù)中心和云計(jì)算(Cloud Foundry)等托管平臺(tái)。
微服務(wù)架構(gòu)
微服務(wù)架構(gòu)是一種將單個(gè)應(yīng)用程序拆分多個(gè)單個(gè)應(yīng)用組成的服務(wù),每個(gè)服務(wù)為獨(dú)立的業(yè)務(wù)開發(fā)獨(dú)立部署,分布式管理。
SpringCloud Eureka
服務(wù)發(fā)現(xiàn)是基于微服務(wù)架構(gòu)的關(guān)鍵原則之一。嘗試手動(dòng)配置每個(gè)客戶機(jī)或某種形式的約定可能很難做到,而且可能很脆弱。Eureka是Netflix服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端。服務(wù)器可以配置和部署為高度可用,每個(gè)服務(wù)器將注冊服務(wù)的狀態(tài)復(fù)制到其他服務(wù)器。
Eureka主要由兩個(gè)組件組成
Eureka服務(wù)器
注解 @EnableEurekaServer
Eureka服務(wù)端用作服務(wù)注冊中心。支持集群部署。
Eureka客戶端。
@EnableDiscoveryClient
Eureka客戶端是一個(gè)java客戶端,用來處理服務(wù)注冊與發(fā)現(xiàn)。
在應(yīng)用啟動(dòng)時(shí),Eureka客戶端向服務(wù)端注冊自己的服務(wù)信息,同時(shí)將服務(wù)端的服務(wù)信息緩存到本地。客戶端會(huì)和服務(wù)端周期性的進(jìn)行心跳交互,以更新服務(wù)租約和服務(wù)信息。
注解@EnableEurekaClient上和@EnableDiscoveryClient
@EnableEurekaClient有@EnableDiscoveryClient的功能,其實(shí)@EnableEurekaClient注解就是一種方便使用eureka的注解而已,可以說使用其他的注冊中心后,都可以使用@EnableDiscoveryClient注解。
一、搭建單節(jié)點(diǎn)應(yīng)用
1.1 需要搭建的工程
父工程:用來管理springcloud版本,采用的是Greenwich.SR5,springboot為2.1.12版本。
子工程:用來注冊Eureka服務(wù)
子工程:用來發(fā)現(xiàn)Eureka服務(wù)
目錄為
創(chuàng)建maven工程Spring-cloud-parent
~~mi-eureka(父工程右鍵 new--》Module)
~~mi-user(同上)
1.1.1 父工程只需要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.mi</groupId>
<artifactId>Spring-Coud-Example</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>mi-eureka</module>
<module>mi-user</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
</parent>
<properties>
<spring-cloud.version>Greenwich.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
1.2 創(chuàng)建eureka注冊服務(wù) 子工程配置及依賴
1.2.1 子工程目錄

1.2.2 配置EurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
1.2.3 配置application.yml
spring:
application:
name: mi-eureka
server:
port: 8000
eureka:
instance:
hostname: localhost
client:
fetch-registry: false
register-with-eureka: false #因?yàn)樽约壕褪欠?wù)中心 所以不需要注冊
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
1.2.4 配置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">
<!-- 指定父pom, 在父pom中配置子模塊的公共依賴 -->
<parent>
<artifactId>Spring-Coud-Example</artifactId>
<groupId>com.mi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<packaging>jar</packaging>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mi</groupId>
<artifactId>mi-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 模塊名及描述信息 -->
<name>mi-eureka</name>
<description>Spring Cloud Eureka</description>
<!-- eureka server: 提供服務(wù)發(fā)現(xiàn)與服務(wù)注冊 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能夠以Maven的方式為應(yīng)用提供SpringBoot的支持,可以將
SpringBoot應(yīng)用打包為可執(zhí)行的jar或war文件, 然后以通常的方式運(yùn)行SpringBoot應(yīng)用
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2.5 啟動(dòng) EurekaApplication
啟動(dòng)服務(wù)并訪問地址:localhost:8000

1.3 創(chuàng)建user服務(wù)發(fā)現(xiàn)子工程配置及依賴
工程包目錄結(jié)構(gòu)同上
1.3.1 配置DiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
1.3.2 配置application.yml
使用的ORM 是基于hibernate的JPA。
server:
port: 9001
servlet:
context-path: /mi-user
spring:
application:
name: user
jpa:
show-sql: true
hibernate:
ddl-auto: none
properties:
hibernate.format_sql: true
open-in-view: false
database-platform: org.hibernate.dialect.MySQL5Dialect
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://127.0.0.1:3306/scloud?characterEncoding=utf-8&useSSL=false
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
1.3.3 配置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>mi-user</artifactId>
<groupId>com.mi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mi</groupId>
<artifactId>user-server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<!-- 引入 Web 功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--
Eureka 客戶端, 客戶端向 Eureka Server 注冊的時(shí)候會(huì)提供一系列的元數(shù)據(jù)信息, 例如: 主機(jī), 端口, 健康檢查url等
Eureka Server 接受每個(gè)客戶端發(fā)送的心跳信息, 如果在某個(gè)配置的超時(shí)時(shí)間內(nèi)未接收到心跳信息, 實(shí)例會(huì)被從注冊列表中移除
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Java Persistence API, ORM 規(guī)范 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 數(shù)據(jù)庫連接 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 驅(qū)動(dòng), 注意, 這個(gè)需要與 MySQL 版本對(duì)應(yīng) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
<scope>runtime</scope>
</dependency>
<!-- apache 提供的一些工具類 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能夠以Maven的方式為應(yīng)用提供SpringBoot的支持,可以將
SpringBoot應(yīng)用打包為可執(zhí)行的jar或war文件, 然后以通常的方式運(yùn)行SpringBoot應(yīng)用
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.3.4 啟動(dòng) UserApplication
啟動(dòng)服務(wù)并訪問地址:localhost:9001
對(duì)于紅色的字體,只是在檢查服務(wù)的安全,可以不用理會(huì)

二、搭建高可用Eureka服務(wù)
2.1 在Eureka 工程y#ml 上 添加多個(gè)服務(wù)
注釋之前的
#spring:
# application:
# name: mi-eureka
#server:
# port: 8000
#eureka:
# instance:
# hostname: localhost
# client:
# fetch-registry: false
# register-with-eureka: false #因?yàn)樽约壕褪欠?wù)中心 所以不需要注冊
# service-url:
# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
---
spring:
application:
name: mi-eureka
profiles: server1
server:
port: 8000
eureka:
instance:
hostname: server1
prefer-ip-address: false
client:
service-url:
defaultZone: http://server2:8001/eureka/,http://server3:8002/eureka/
---
spring:
application:
name: mi-eureka
profiles: server2
server:
port: 8001
eureka:
instance:
hostname: server2
prefer-ip-address: false
client:
service-url:
defaultZone: http://server1:8000/eureka/,http://server3:8002/eureka/
---
spring:
application:
name: mi-eureka
profiles: server3
server:
port: 8002
eureka:
instance:
hostname: server3
prefer-ip-address: false
client:
service-url:
defaultZone: http://server1:8000/eureka/,http://server2:8001/eureka/
2.2 對(duì)項(xiàng)目進(jìn)行打包
在父工程目錄下進(jìn)行打包命令
mvn clean package -Dmaven.test.skip=true -U
打包成jar包
2.3 修改本地hostname
在此之前修改本地的hostname,以免服務(wù)名重復(fù)沖突。
演示 win 10
在 C:\Windows\System32\drivers\etc下的hosts文件,進(jìn)行編輯,添加如下
微服務(wù) 本地發(fā)現(xiàn)
127.0.0.1 server1
127.0.0.1 server2
127.0.0.1 server3
2.4 打開3個(gè)cmd窗口,到打包jar下的目輸入命令
在此演示是方法項(xiàng)目錄是生成的target下的jar包

三個(gè)cmd窗口依次輸入
java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server1
java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server2
java -jar mi-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server3
2.5 訪問地址端口
訪問 localhost:8000

3 總結(jié)
- @EnableEurekaServer @EnableEurekaClient
- 心跳檢測、健康檢查、負(fù)載均衡等功能
- Eureka的高可用,生產(chǎn)上建議至少兩臺(tái)以上
- 分布式系統(tǒng)中、服務(wù)注冊中心是最重要的基本部分
以上就是本篇文的內(nèi)容,覺得不錯(cuò)就給個(gè)贊唄。
后為持續(xù)更新記錄。