如果你對 Spring Cloud 體系還不是很瞭解,可以先讀一下 "Spring Cloud 都有哪些模塊" Eureka 是 Netflix 開源的服務註冊發現組件,服務發現可以說是微服務架構的核心功能了,微服務部署之後,一定要有服務註冊和發現的能力,Eureka 就是擔任這個角色的。如果你用過 ...
如果你對 Spring Cloud 體系還不是很瞭解,可以先讀一下 Spring Cloud 都有哪些模塊
Eureka 是 Netflix 開源的服務註冊發現組件,服務發現可以說是微服務架構的核心功能了,微服務部署之後,一定要有服務註冊和發現的能力,Eureka 就是擔任這個角色的。如果你用過 dubbo 的話,那一定知道 dubbo 中服務註冊和發現的功能是用 zookeeper 來實現的。
Eureka 目前是 2.x 版本,並且官方已經宣佈不再維護更新。不過其實 Eureka 已經很穩定了,當做註冊中心完全沒有問題。Spring Cloud 集成了 Eureka ,並做了完善的封裝。方便我們使用 Spring boot 開發的時候簡單配置就可以使用。
微服務框架中有三類角色,分別是註冊中心、服務提供者、服務消費者,註冊中心就是今天要說的主角 Eureka,這篇文章簡單說明 Spring Cloud Eureka 的使用,模擬實現單點和高可用註冊中心,並簡單介紹服務提供者和服務消費者如何使用 Eureka 提供的服務註冊和發現功能。
版本說明
Java : 1.8
Spring Boot : 2.1.3.RELEASE
Spring Cloud: Finchley.SR2
之說以要說一下版本,因為 Finchley.SR2 版本較之前的版本包名有變化,所以在引用 maven 包的時候要註意。
單點註冊中心
創建 Eureka 註冊中心
1、引用 maven 包,其中
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 最新版的 eureka 服務端包 -->
<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-actuator</artifactId>
</dependency>
2、新建 bootstrap.yml,並配置 Spring cloud 參數
spring:
application:
name: kite-eureka-center
cloud:
inetutils: ## 網卡設置
ignoredInterfaces: ## 忽略的網卡
- docker0
- veth.*
- VM.*
preferredNetworks: ## 優先的網段
- 192.168
3、新建 application.yml ,並配置參數
server:
port: 3000
eureka:
instance:
hostname: eureka-center
appname: 註冊中心
client:
registerWithEureka: false # 單點的時候設置為 false 禁止註冊自身
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:3000/eureka
server:
enableSelfPreservation: false
evictionIntervalTimerInMs: 4000
bootstrap.yml 和 application.yml 的區別:
bootstrap.yml 在 application.yml 之前啟動;
bootstrap.yml 配置 application 的 name、spring.cloud.config.server.git.uri、一些encryption/decryption(加密/解密)信息;
application.yml 的信息會覆蓋 bootstrap.yml 中的內容,當遇到相同的配置的時候;
4、新建 Application.java 啟動文件
@EnableEurekaServer
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableEurekaServer
表示使用 Eureka Server 端功能,也就是啟動為一個註冊中心節點。
5、運行 Application.java ,訪問 http://localhost:3000 即可看到 Eureka 提供的 ui 控制台。
創建一個服務提供者
接下來創建一個服務提供者,並註冊到上面創建的 Eureka 註冊中心。
1、添加 maven 依賴包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- eureka 客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、配置 application.yml
server:
port: 3001
eureka:
instance:
preferIpAddress: true
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka ## 註冊到 eureka
spring:
application:
name: single-provider ## 應用程式名稱,後面會在消費者中用到
3、創建一個簡單的 RESTful 介面 controller
@Slf4j
@RestController
public class ProviderController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping(value = "/hello")
public String hello(){
List<String> services = discoveryClient.getServices();
for(String s : services){
log.info(s);
}
return "hello spring cloud!";
}
@RequestMapping(value = "/nice")
public String nice(){
List<String> services = discoveryClient.getServices();
for(String s : services){
log.info("gogogo" + s);
}
return "nice to meet you!";
}
}
4、創建 spring boot 啟動類
@EnableEurekaClient
@SpringBootApplication
public class SingleProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SingleProviderApplication.class, args);
}
}
@EnableEurekaClient
修飾,表示要註冊到註冊中心。
5、啟動項目,正常情況下就註冊到了 Eureka 註冊中心,打開 Eureka 控制台,會看到已經出現了這個服務
創建一個服務消費者
有了服務提供者,接下來創建一個消費者來消費一下
1、引用 maven 包
<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.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、配置 application.yml
server:
port: 3002
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:3000/eureka ## 註冊到 eureka
instance:
preferIpAddress: true
spring:
application:
name: single-customer
3、開始消費提供者提供的服務介面,這裡演示了兩種消費方法,一種是用 RestTemplate ,另外一種是用 FeignClient,Feign 同樣是 Netflix 開源,並被 Spring Cloud 封裝到 spring-cloud-starter-openfeign 包中。
創建啟動類,並添加相關註解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SingleCustomerApplication {
/**
* 註入 RestTemplate
* 並用 @LoadBalanced 註解,用負載均衡策略請求服務提供者
* 這是 Spring Ribbon 的提供的能力
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(SingleCustomerApplication.class, args);
}
}
@EnableEurekaClient
聲明此項目為一個 eureka 客戶端,@EnableFeignClients
聲明此項目可以使用 Feign。
4、創建一個服務介面類,這是 Feign 的使用方式,詳細的用法可以查一下 Spring Cloud Feign 相關文檔
/**
* IHelloService
* 配置服務提供者:single-provider 是服務提供者的 application.name
*/
@FeignClient("single-provider")
public interface IHelloService {
@RequestMapping(value = "/hello")
String hello();
@RequestMapping(value = "nice")
String nice();
}
@FeignClient
註解的 value 為服務提供者的 appplication.name 。
5、創建一個 Controller 用於調用服務
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private IHelloService helloService;
private static final String applicationName = "single-provider";
@RequestMapping(value = "feignRequest")
public Object feignRequest(){
String s = helloService.nice();
return s;
}
@RequestMapping(value = "commonRequest")
public Object commonRequest(){
String url = "http://"+ applicationName +"/hello";
String s = restTemplate.getForObject(url,String.class);
return s;
}
}
其中 feignRequest 方法是使用了 Feign 的方式調用服務介面;
commonRequest 方法是用 RestTemplate 提供的方法調用服務介面;
6、最後,啟動服務,訪問地址:http://localhost:3002/commonRequest 和 http://localhost:3002/feignRequest
如果你覺得寫的還可以的話,請點個「推薦」吧
歡迎關註,不定期更新本系列和其他文章
古時的風箏
,進入公眾號可以加入交流群