1. 程式人生 > >SpringCloud微服務實戰---服務的註冊和發現(Eureka)

SpringCloud微服務實戰---服務的註冊和發現(Eureka)

clas 清理 註冊中心 rac red mls 保護 gist clu

一、Spring Cloud簡介
Spring Cloud是基於SpringBoot的,為開發人員提供了快速構建分布式系統的一些工具,包括配置管理、服務發現、斷路器、路由、微代理、事件總線、全局鎖、決策競選、分布式會話等等。

二、創建服務註冊中心
在這裏,我們需要用的的組件上Spring Cloud Netflix的Eureka ,eureka是一個服務註冊和發現模塊。

Eureka:

是純正的 servlet 應用,需構建成war包部署
使用了 Jersey 框架實現自身的 RESTful HTTP接口
peer之間的同步與服務的註冊全部通過 HTTP 協議實現
定時任務(發送心跳、定時清理過期服務、節點同步等)通過 JDK 自帶的 Timer 實現

內存緩存使用Google的guava包實現
2.1 首先創建一個maven主工程。
2.2 然後創建2個model工程:一個model工程作為服務註冊中心,即Eureka Server,另一個作為Eureka Client
創建過程:

右鍵工程->創建model-> 選擇spring initialir 如下圖:
圖像

點擊“Next”,輸入對應的名稱,如下圖:

點擊“Next”,選擇“Cloud Discovery”,然後選擇“Eureka Server”,如下圖:

點擊“Next”,選擇保存路徑,最後點擊“Finish”
創建完後的工程的pom.xml文件如下(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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-zureka</artifactId>

<groupId>com.spring.cloud.zureka</groupId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-zureka-server</artifactId>
<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

<build>
    <finalName>${artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <testSource>${java.version}</testSource>
                <testTarget>${java.version}</testTarget>
            </configuration>
        </plugin>
    </plugins>
</build>

</project>
2.3 啟動一個服務註冊中心
只需要一個註解@EnableEurekaServer,這個註解需要在springboot工程的啟動application類上加:

/**

  • @Author lixinhao
  • @Description
  • @Date 2018/4/13 17:25*/
    @EnableEurekaServer
    br/>*/
    @EnableEurekaServer
    public class EurekaServerApplication {

    public static void main(String[] args) {
    SpringApplication.run(EurekaServerApplication.class, args);
    }
    }
    2.4 appication.yml配置
    eureka是一個高可用的組件,它沒有後端緩存,每一個實例註冊之後需要向註冊中心發送心跳(因此可以在內存中完成),在默認情況下erureka server也是一個eureka client ,必須要指定一個 server。eureka server的配置文件appication.yml:

#配置eureka端口,端口一定要獨立
server:
port: 8761

eureka:
instance:
#配置主機名
hostname: localhost
client:
#配置服務註冊中心是否以自己為客戶端進行註冊(配置false)
registerWithEureka: false
#是否取得註冊信息(配置false)
fetchRegistry: false
serviceUrl:
#配置eureka服務地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
通過eureka.client.registerWithEureka:false和fetchRegistry:false來表明自己是一個eureka server

2.5 日誌配置
創建配置文件bootstrap.yml:

#日誌
logging:
config: classpath:logback-spring.xml
path: E:/log/@pom.artifactId@
創建配置文件logback-spring.xml:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n ${LOG_PATH}/info.log ${LOG_PATH}/info-%d{yyyyMMdd}-%i.log 10MB 30 %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n ERROR ${LOG_PATH}/error.log ${LOG_PATH}/error-%d{yyyyMMdd}-%i.log 500MB 2 %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n **2.6 查看界面信息** eureka server 是有界面的,啟動工程,打開瀏覽器訪問:http://localhost:8761 ,界面如下: No instances available 沒有服務被發現,接下來創建服務 **三、創建一個服務提供者 (eureka client)** 當client向server註冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從每個client實例接收心跳消息。 如果心跳超時,則通常將該實例從註冊server中刪除。 創建過程同server類似,創建完pom.xml如下: springcloud-zureka com.spring.cloud.zureka 0.0.1 4.0.0 springcloud-zureka-client jar UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web ${artifactId} org.springframework.boot spring-boot-maven-plugin org.apache.maven.plugins maven-compiler-plugin ${java.version} ${java.version} ${java.version} ${java.version} 通過註解@EnableEurekaClient 表明自己是一個eureka client. /** * @Author lixinhao * @Description * @Date 2018/4/13 17:25 */ @EnableEurekaClient @SpringBootApplication @RestController public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi "+name+",i am from port:" +port; } } 在配置文件中註明自己的服務註冊中心的地址,application.yml配置文件如下: eureka: client: serviceUrl: #配置eureka服務地址,鏈接註冊中心地址 defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: #在註冊中心顯示的“Application”名稱 name: "@pom.artifactId@" 註:spring.application.name中使用了@pom.artifactId@,在YML文件中需要加上單引號或者雙引號,否則無法獲取值 需要指明spring.application.name,這個很重要,這在以後的服務與服務之間相互調用一般都是根據這個name 。 啟動工程,打開http://localhost:8761 ,即eureka server 的網址: 你會發現一個服務已經註冊在服務中了,服務名為springcloud-zureka-client,端口為:8762 **四、Eureka的自我保護模式** 如果在Eureka Server的首頁看到以下這段提示,則說明Eureka已經進入了保護模式: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY‘RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE. 產生原因: Eureka Server在運行期間,會統計心跳失敗的比例在15分鐘之內是否 低於85%,如果出現低於的情況(在單機調試的時候很容易滿足,實際在 生產環境上通常是由於網 絡不穩定導致),Eureka Server會將當前的實例註冊信息保護起來,同時提 示這個警告。保護模式主要用於一組客戶端和Eureka Server之間存在網絡分 區場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其服務註 冊表中的信息,不再刪除服務註冊表中的數據(也就是不會註銷任何微服務) 解決方法: 1.Eureka Server端:配置關閉自我保護,並按需配置Eureka Server清理無效節點的時間間隔。 > eureka.server.enable-self-preservation # 設為false,關閉自我保護 > eureka.server.eviction-interval-timer-in-ms # 清理間隔(單位毫秒,默認是60*1000) 2.Eureka Client端:配置開啟健康檢查,並按需配置續約更新時間和到期時間 > eureka.client.healthcheck.enabled # 開啟健康檢查(需要spring-boot-starter-actuator依賴) > eureka.instance.lease-renewal-interval-in-seconds # 續約更新時間間隔(默認30秒) > eureka.instance.lease-expiration-duration-in-seconds # 續約到期時間(默認90秒) 生產環境建議采用默認配置,服務停止到註冊中心清除實例之間有一些計算什麽的。****

SpringCloud微服務實戰---服務的註冊和發現(Eureka)