一、前言
在上一篇博客中,小編簡單的向大家介紹了springcloud的一些概念,大家可能對那些還是不太的瞭解,不過沒有問題,盲人摸象嘛,慢慢的摸,你會了解的越來越多的。所以不用擔心。在下面的博客,小編依次介紹,依次實現。
在這篇博客中,小編介紹一下注冊中心——Eureka。
二、註冊中心Eureka
想必做過Dubbo的老鐵們一定使用過Zookeeper吧。這裏的zookeeper就起到了一個註冊中心的作用。Dubbo架構中分成了提供者和消費者,提供者需要把自己的服務註冊到註冊中心,消費者訂閱註冊中心,註冊中心有提供者後,會通知消費者。ZK起到了一個服務協調的作用。
在springcloud中,自己提供了一個註冊中心——Eureka。
Eureka是一個基於REST(Representational State Transfer)的服務,主要用於AWS cloud, 提供服務定位(locating services)、負載均衡(load balancing)、故障轉移(failover of middle-tier servers)。我們把它叫做Eureka Server. Eureka也提供了基於Java的客戶端組件,Eureka Client,內置的負載均衡器可以實現基本的round-robin負載均衡能力。在Netflix,一個基於Eureka的更復雜的負載均衡器針對多種因素(如流量、資源利用率、錯誤狀態等)提供加權負載均衡,以實現高可用(superior resiliency).
三、服務註冊中心
3.1 建立Maven項目
小編使用springboot的快速生產項目的網站 http://start.spring.io/,來生產項目:
導入idea:
3.2 導入Eureka依賴和springcloud依賴
在maven的pom文件中,添加Eureka依賴:spring-cloud-starter-eureka-server
<?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.forezp</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.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>Edgware.SR2</spring-cloud.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test-->
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<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>
添加完成的時候,如果要建立父子pom,需要把${spring-cloud.version}
提取出來。這樣子pom中跟springcloud相關的就不用設置版本號了。
3.3 代碼編寫
springboot有一個application的啓動類,我們這裏就修改這個啓動類:添加@EnableEurekaServer
。通過這個註解,啓動一個服務註冊中心提供給其他應用進行對話。
package com.wl.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3.4 修改配置文件
在默認情況下,註冊中心會將自己作爲客戶端來嘗試註冊自己,所以我們需要禁用它的客戶端註冊行爲。需要在application.properties文件或application.yml中添加配置。
注意:生成的maven項目默認是application.properties,沒有application.yml,對比一下,官方很多的demo中使用的是application.yml,另外application.yml天然的形成了樹結構。代碼寫的也少。
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
代碼說明:
eureka.client.registerWithEureka:false ,由於應用爲註冊中心, 來表明自己是一個eureka server. 不會把自己註冊到自己上。
eureka.client.fetchRegistry:由於註冊中心的職責是維護服務實例,不需要去檢索服務,所以也設置爲false
3.5 運行
運行後,輸入http://localhost:8761/
,打開註冊中心監控頁面:
3.6 Eureka配置用戶名密碼登錄
pom文件中添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
修改配置文件:
server:
port: 8761
security:
basic:
enabled: true
user:
name: admin
password: admin
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@${eureka.instance.hostname}:${server.port}/eureka/
再次登錄的時候,會出現輸入賬戶和密碼的彈窗:
四、服務提供者
建立如下的結構:
當client向server註冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從每個client實例接收心跳消息。 如果心跳超時,則通常將該實例從註冊server中刪除。
創建過程同server類似,創建完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.wl</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.wl</groupId>
<artifactId>scf</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
</project>
創建controller:
package com.wl.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Ares on 2018/4/11.
*/
@RestController
public class User {
@GetMapping("/user/findById")
public String findById(@RequestParam("id")String id){
return "這個是springcloud的客戶端"+id;
}
}
配置啓動類:
package com.wl.client;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
類中@EnableEurekaClient或@EnableDiscoveryClient註解,激活EurekaDiscoveryClient實現,自動化配置,創建DiscoveryClient接口針對Eureka客戶端的EnableDiscoveryClient實例。
修改配置文件:
server:
port: 9001
eureka:
client:
serviceUrl:
defaultZone: http://${security.user.name}:${security.user.password}@localhost:8761/eureka/
spring:
application:
name: client1
security:
basic:
enabled: true
user:
name: admin
password: admin
在配置文件中,使用spring.application.name配置服務名,如命名爲client1;通過eureka.serviceUrl.defaultZone指定服務註冊中心的地址,這裏小編指定的是之前建立的註冊中心地址。
依次啓動註冊中心http://localhost:8761/
和提供者
我們可以通過訪問 http://localhost:9001//user/findById?id=1
來訪問提供者:
五、小結
Eureka服務註冊發現,容錯管理、失效剔除、自我保護、安全驗證。功能真是很強大,使用也非常好用,多多用吧。