springcloud學習1:eureka server 和client 的構建
使用的springboot版本是2.0.0
一、eureka簡單介紹
eureka是一個服務發現組件,是為了解決微服務相互之間調用時通過硬編碼服務地址進行調用的弊端。
硬編碼服務地址進行調用主要有以下兩個弊端:
(1) 如果服務提供者的網絡地址(IP和端口)發生了變化,將會影響服務消費者。
(2) 一般服務提供者會部署多個實例進行高可用和負載均衡,硬編碼服務地址無法實現這種功能。
所以需要服務發現組件來動態的獲取服務地址。服務提供者,服務消費者,發現組件這三個之間應該有這樣的關系:
- 各個微服務在啟動時,將自己的網絡地址等信息注冊到服務發現組件中,服務發現組件會存儲這些信息
- 服務消費者可從服務發現組件查詢服務提供者的網絡地址,並使用該地址調用服務提供者的接口
- 各個微服務與服務發現組件使用一定機制(如心跳)通信。服務發現組件如長時間無法與某微服務實例通信,就會注銷該實例。
- 微服務網絡地址發生變更(例如實例增減或IP端口發生變化時),會重新注冊到服務發現組件中。
eureka包含server和client兩部分,eureka server提供服務發現的能力,各個微服務啟動時會向eureka server注冊自己的地址。eureka client是一個java客戶端,用來簡化和eureka server的交互。
二、創建單節點的eureka server服務
(1) 創建springboot工程,maven依賴如下
<?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.lyy</groupId>
<artifactId>eureka_server</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/>
</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.M8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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>
</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>
</project>
(2) 在啟動類上加上@EnableEurekaServer
注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
(3) 在配置文件中進行eureka的端口和連接地址等的配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # 是否將自己注冊到Eureka Server,默認為true。由於當前應用就是Eureka Server,故而設為false
fetch-registry: false # 表示是否從Eureka Sever獲取注冊信息,默認為true。因為這個一個單節點的Eureka Server,不需要同步其他的Eureka Server節點的數據,故而設為false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 設置與Eureka Server交互的地址,查詢服務和注冊服務都需要依賴這個地址。
啟動工程,訪問http://localhost:8761/
,可以看到eureka的管理界面,表示服務搭建成功。
三、創建eureka client,服務提供者
要注意的是服務提供者和服務發現者都是eureka client。
創建springboot工程demo-provider-user,引入eureka-client的依賴
<?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.lyy</groupId>
<artifactId>demo_provider_user</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.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.M8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--熱部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</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>
</project>
在工程的啟動類上加上@EnableEurekaClient
注解
@SpringBootApplication
@EnableEurekaClient
public class UserProviderApplication {
public static void main(String[] args) {
SpringApplication.run(UserProviderApplication.class);
}
}
在配置文件中配置連接到eureka server
server:
port: 8082
servlet:
# 這是配置應用的根目錄
context-path: /provider
spring:
application:
name: demo-provider-user
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true # 將自己的IP注冊到Eureka Server。若不配置或設置為false,表示注冊微服務所在操作系統的hostname到Eureka Server
對外提供一個查詢所有用戶的接口
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/findAll")
public List<User> findAll(){
User user=new User();
user.setName("zs");
List<User> list=new ArrayList<>();
list.add(user);
return list;
}
}
這個接口在提供者工程中的訪問地址是http://localhost:8082/provider/user/findAll
四、創建eureka client 服務消費者
創建springboot工程demo_consumer_user,引入eureka-client的依賴,pom文件的內容和服務提供者類似
在工程的啟動類上加@EnableEurekaClient
注解
在配置文件中配置連接到eureka server
五、測試
先啟動eureka server,再啟動eureka client,訪問eureka的管理界面,看兩個client服務是否注冊到了server上。