目錄
- spring cloud(一) 從一個(gè)簡(jiǎn)單的springboot服務(wù)開(kāi)始
- spring cloud(二) 起步汁掠,集成Eureka服務(wù)發(fā)現(xiàn)
- spring cloud(三)Eureka高可用性+Feign聲明式Rest客戶端
-
spring cloud(四) Eureka配置Httpbasic驗(yàn)證+Eureka配置詳解
未完待續(xù)
未完待續(xù)
一略吨、 Eureka介紹
上一篇我們使用spring boot編寫了兩個(gè)簡(jiǎn)單的服務(wù)集币,并讓consume_server通過(guò)硬編碼的方式調(diào)用了product_server考阱。我們發(fā)現(xiàn)這樣的方式實(shí)現(xiàn)起來(lái)過(guò)于復(fù)雜,每次都要手工配置服務(wù)地址鞠苟,如果服務(wù)地址有變動(dòng)又需要重新改一遍乞榨。這樣的方式過(guò)于繁瑣,而且容易出錯(cuò)当娱。如果這一切可以自動(dòng)就好了吃既。
這時(shí)我們需要一個(gè)服務(wù)發(fā)現(xiàn),服務(wù)發(fā)現(xiàn)是基于微服務(wù)架構(gòu)的關(guān)鍵原則之一跨细。嘗試配置每個(gè)客戶端或某種形式的約定可能非常困難鹦倚,非常脆弱。Netflix服務(wù)發(fā)現(xiàn)服務(wù)器和客戶端是Eureka冀惭≌鹦穑可以將服務(wù)器配置和部署為高可用性掀鹅,每個(gè)服務(wù)器將注冊(cè)服務(wù)的狀態(tài)復(fù)制到其他服務(wù)器。
我們需要用服務(wù)發(fā)現(xiàn)框架實(shí)現(xiàn)什么功能呢媒楼?
- 需要有一個(gè)服務(wù)注冊(cè)器乐尊,可以將提供服務(wù)的微服務(wù)注冊(cè)到注冊(cè)器里面。
- 需要有服務(wù)發(fā)現(xiàn)機(jī)制划址,我們可以通過(guò)客戶端方便的找到我們需要的服務(wù)扔嵌。
- 容災(zāi)能力,當(dāng)服務(wù)注冊(cè)器掛掉之后還能保證服務(wù)之間交互正常夺颤。
Eureka為我們提供了以上的解決方案痢缎,它分為Eureka-server和Eureka-client兩個(gè)部分,Eureka提供服務(wù)注冊(cè)服務(wù)發(fā)現(xiàn)功能拂共,可以部署為Eureka-server集群牺弄。Eureka-client的主要功能是將服務(wù)注冊(cè)到Eureka-server,通過(guò)Eureka-server發(fā)現(xiàn)服務(wù)。接下來(lái)讓我們基于上篇文章介紹的兩個(gè)微服務(wù)一步步配置Eureka-server和Eureka-client宜狐,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)功能势告。
二、 EurekaServer配置
spring cloud為我們提供了開(kāi)箱即用的工具抚恒,我們只需要簡(jiǎn)單的配置就可以啟動(dòng)一個(gè)EurekaServer咱台。
1. 創(chuàng)建一個(gè)eureka_server項(xiàng)目
2. 配置依賴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.yshmsoft</groupId>
<artifactId>eureka_server</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</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依賴,并配置dependencyManagement俭驮。spring cloud使用的版本是當(dāng)前最新的Finchley.RELEASE版回溺。
3. 創(chuàng)建啟動(dòng)類
package com.yshmsoft;
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);
}
}
@EnableEurekaServer,開(kāi)啟eureka-server自動(dòng)配置混萝。
4. 配置application.yml
spring:
application:
name: eureka-server
server:
port: 8761
eureka:
client:
fetch-registry: false # 是否獲取注冊(cè)信息, 目前只有自己一個(gè)eureka-server遗遵,無(wú)需同步注冊(cè)信息
register-with-eureka: false # 是否注冊(cè)到eureka, 因?yàn)樽约壕褪莈ureka-server所以無(wú)需注冊(cè)
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
instance:
hostname: localhost
4 . 啟動(dòng)項(xiàng)目訪問(wèn)http://localhost:8761
現(xiàn)在我們可以看到在Instances currently registered with Eureka中并沒(méi)有服務(wù)注冊(cè)逸嘀,接下來(lái)车要,讓我們修改一下上篇文章中的兩個(gè)示例,將他們作為服務(wù)注冊(cè)到Eureka-server中崭倘。
三翼岁、 將服務(wù)注冊(cè)到Eureka-Server中
1. 打開(kāi)product_server項(xiàng)目,修改pom.xml為如下內(nèi)容
<?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.yshmsoft</groupId>
<artifactId>product_server</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
引入spring-cloud-starter-netflix-eureka-client依賴司光。并配置dependencyManagement琅坡。
2. 在啟動(dòng)類加上EnableDiscoveryClient注解
package com.yshmsoft;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProductApplocation {
public static void main(String[] args) {
SpringApplication.run(ProductApplocation.class, args);
}
}
EnableDiscoveryClient注解在spring cloud commons包下,它是一個(gè)抽象程度比較高的注解残家,在本項(xiàng)目中也可以使用EnableEurekaClient注解專門針對(duì)Eureka提供的注解榆俺。
3. 編輯application.yml
server:
port: 8080
spring:
datasource:
platform: h2
schema: classpath:schema.sql
data: classpath:data.sql
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
application:
name: product-server # 在eureka中此值作為vipaddress,在發(fā)現(xiàn)服務(wù)時(shí)使用
logging:
level:
root: info
org.hibernate: info
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
新增 cureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
4. 啟動(dòng)項(xiàng)目查看http://localhost:8761/eureka/是否注冊(cè)成功
5. 同樣的步驟配置consume_server并查看http://localhost:8761/eureka/是否注冊(cè)成功
我們看到所有服務(wù)都已注冊(cè)成功了。
三、 在consume_server使用EurekaClient發(fā)現(xiàn)服務(wù)并使用服務(wù)
分為四個(gè)步驟:
- 依賴注入EurekaClient茴晋。
- 調(diào)用EurekaClient的getNextServerFromEureka方法傳入迂求。vipaddress(application.yml中的spring.application.name的值)獲取服務(wù)。
- 將之前硬編碼的url替換成服務(wù)發(fā)現(xiàn)的url晃跺。
- 訪問(wèn)http://localhost:8000/user/1看是否成功
package com.yshmsoft.controller;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.yshmsoft.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@Qualifier("eurekaClient")
@Autowired
EurekaClient eurekaClient;
@GetMapping("/user/{id}")
User getUserById(@PathVariable Long id) {
InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("product-server", false);
Map urlVariables = new HashMap();
urlVariables.put("hostName", instanceInfo.getHostName());
urlVariables.put("port", instanceInfo.getPort());
User user = restTemplate.getForObject("http://{hostName}:{port}/" + id, User.class,urlVariables);
return user;
}
}
到此通過(guò)spring-cloud配置Eureka服務(wù)發(fā)現(xiàn)完成揩局。
通過(guò)spring-cloud集成Eureka服務(wù)發(fā)現(xiàn)框架完成,想想還有什么不足掀虎?
服務(wù)發(fā)現(xiàn)依賴于Eureka-server,如果Eureka-server掛點(diǎn)怎么辦凌盯,是否可以將Eureka-server集群化?
拼接url太過(guò)繁瑣有沒(méi)有更好的方案烹玉?
那么請(qǐng)繼續(xù)關(guān)注驰怎,下次再說(shuō)。