1.建立Parentjava
Parent很簡單,建立一個空的maven項目,pom以下:web
<?xml version="1.0" encoding="UTF-8"?>spring
<project xmlns="http://maven.apache.org/POM/4.0.0"apache
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"api
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.zuikc</groupId>架構
<artifactId>springcloud.parent</artifactId>app
<packaging>pom</packaging>webapp
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka01</module>
<module>eureka02</module>
<module>provider01</module>
<module>provider02</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
</project>
注意兩個地方:
1:spring-boot-starter-parent要被指定爲整個解決方案的parent;
2:4個Modul隨着下文項目的建立會被自動建立;
2.建立eureka01
若是說dubbo的註冊中心zookeeper,那麼在spring cloud中的註冊中心就是:eureka,而且使用起來還要更容易上手一些。
如今,就讓咱們來建立第一個eureka站點。
首先先建立一個maven子模塊,並添加公用依賴。
類型選擇以下:
建立完畢,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/maven-v4_0_0.xsd">
<parent>
<artifactId>springcloud.parent</artifactId>
<groupId>com.zuikc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>eureka01</name>
<artifactId>eureka01</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.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>
<dependencies>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
代碼:
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @ClassName RegisterApplication
* @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@EnableEurekaServer
@SpringBootApplication
public class RegisterApplication {
public static void main(String[] args) {
SpringApplication.run(RegisterApplication.class,args);
}
}
application.yml
server:
port: 9091
eureka:
instance: #定義Eureka實例
hostname: eureka-9091.com #Eureka實例所在的主機名
client:
register-with-eureka: false #表示是否將本身註冊到Eureka Server上,默認爲true
fetch-registry: false #表示是否從Eureka Server上獲取註冊信息,默認爲true
service-url:
defaultZone: http://localhost:9091/eureka/
接着run RegisterApplication,若是沒有異常報錯,再從瀏覽器訪問http://localhost:9091/,看到以下界面,則說明成功。
3.建立服務提供者provider0一、provider02
有了註冊中心了,如今,讓咱們寫兩個服務提供者站點。
服務提供者,也叫Eureka客戶端,它把本身註冊到Eureka服務器中,並週期性的發送心跳來更新它的服務租約。
爲何要兩個呢?爲了體現分佈式呀。咱們建立兩個子模塊,它們的類型都是webapp,以下,
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/maven-v4_0_0.xsd">
<parent>
<artifactId>springcloud.parent</artifactId>
<groupId>com.zuikc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>provider01</name>
<artifactId>provider01</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
而後啓動類爲:
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @ClassName Provider1Application
* @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@SpringBootApplication
@EnableDiscoveryClient
public class Provider1Application {
public static void main(String[] args) {
SpringApplication.run(Provider1Application.class, args);
}
}
而後controller爲:
package com.zuikc;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @ClassName HelloController
* @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@Configuration
@Controller
public class HelloController {
@RequestMapping("hello")
@ResponseBody
public String hello() {
return "hello zuikc.com!";
}
}
而後application.yml爲:
server:
port: 9191
spring:
application:
name: hello-service
eureka:
client:
service-url:
defaultZone: http://localhost:9091/eureka/
注意,第二個服務項目,上面的配置中的port爲9192就是了,其它配置和控制器自己的代碼都如出一轍。
而後,先啓動eureka,再分別啓動兩個服務提供者。結果以下:
4.Eureka的集羣
如下這張圖是springcloud著名的架構圖,
在這張圖中,咱們能夠看到,包括EurekaServer(即註冊中心)自己,也是不止一個的。這是由於,在實際的應用中,註冊中心理應是能夠被集羣的。這樣,當集羣中有分片發生故障的時候,Eureka會自動轉入自我保護模式。它容許在分片發生故障的時候繼續提供服務的發現和註冊,當故障分配恢復時,集羣中的其餘分片會把他們的狀態再次同步回來。
5.建立eureka02
既然說到了註冊中心的集羣,那咱們就來繼續建立一個eureka服務器吧。
在parent下創建子module。全部過程和建立eureka01同樣,而且pom和RegistApplication也同樣。
惟一須要改變的就是配置文件。
首先,然咱們回到eureka01中,修改application.yml以下:
server:
port: 9091
eureka:
instance: #定義Eureka實例
hostname: eureka-9091.com #Eureka實例所在的主機名
client:
#register-with-eureka: false #表示是否將本身註冊到Eureka Server上,默認爲true
#fetch-registry: false #表示是否從Eureka Server上獲取註冊信息,默認爲true
service-url:
defaultZone: http://localhost:9092/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-service
首先,咱們將client下兩個不容許本身註冊的屬性註釋掉。
同時,將service-url的地址指向到了第二個註冊中心的地址。也就是說,兩個註冊中心要互相引用。
其次,咱們加了enable-self-preservation: false,這屬性默認是開啓的,若是默認開啓,註冊中心的服務列表就算有些服務斷開了,也會繼續保存。
最後,咱們加了spring這個屬性節點,將自己做爲服務命名爲eureka-service。
Ok,而後再來修改第二個eureka服務器的配置文件,
server:
port: 9092
eureka:
instance: #定義Eureka實例
hostname: eureka-9092.com #Eureka實例所在的主機名
client:
#register-with-eureka: false #表示是否將本身註冊到Eureka Server上,默認爲true
#fetch-registry: false #表示是否從Eureka Server上獲取註冊信息,默認爲true
service-url:
defaultZone: http://localhost:9091/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-service
整個項目建立完畢,目錄結構大概是這樣的,
接下來,讓咱們首先啓動eureka01。注意,啓動01的時候因爲02尚未啓動,因此會報鏈接不到02,可是沒有關係,忽略就行,由於02立刻就會啓動,它會自動續約。
接着啓動eureka02,而後再啓動兩個provider吧。
能夠看到,4個服務都已經啓動了,
注意,這個時候去9092,也就是eureka02,也能看到這4個服務,
感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。