1. 程式人生 > >Chapter 1 快速搭建-服務的註冊與發現(Eureka)

Chapter 1 快速搭建-服務的註冊與發現(Eureka)

Chapter 1 快速搭建-服務的註冊與發現(Eureka)

一、Spring Cloud簡介

為開發人員提供了快速構建分散式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智慧路由,微代理,控制匯流排)。分散式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支援實現這些模式的服務和應用程式。他們將在任何分散式環境中執行良好,包括開發人員自己的膝上型電腦,裸機資料中心,以及Cloud Foundry等託管平臺。

 

特性:

•       Spring Cloud專注於提供良好的開箱即用經驗的典型用例和可擴充套件性機制覆蓋。

•       分散式/版本化配置

•       服務註冊和發現

•       路由

•       service - to - service呼叫

•       負載均衡

•       斷路器

•       分散式訊息傳遞

二、開發環境

• Jdk1.8

• Maven

• IntelliJ IDEA

三、環境搭建(服務註冊中心)

3.1首先建立一個maven主工程。

3.2 然後建立2個model工程:一個model工程作為服務註冊中心,即Eureka Server,另一個作為Eureka Client。

 

下面以建立server為例子,詳細說明建立過程:

 

右鍵工程->建立model->選擇spring initialir 如下圖

下一步->選擇clouddiscovery->eureka 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.harry</groupId>
   <
artifactId>springclouddemo</artifactId>
   <
version>0.0.1-SNAPSHOT</version>
   <
packaging>jar</packaging>

   <
name>springclouddemo</name>
   <
description>Demo project for Spring Boot</description>

   <
parent>
      <
groupId>org.springframework.boot</groupId>
      <
artifactId>spring-boot-starter-parent</artifactId>
      <
version>2.0.1.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>Finchley.M9</spring-cloud.version>
   </
properties>

   <
dependencies>
      <
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-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檔案中可以看到,我們使用的springboot 版本是<version>2.0.1.RELEASE</version>

Spring cloud 版本 <spring-cloud.version>Finchley.M9</spring-cloud.version>

註釋:Finchley.M9

Spring Cloud Finchley 的第 9 個里程碑版 M9 已釋出。需注意的是,自上個 M8 版本開始,專案已與 Spring Boot 2 相容,不過不相容 Spring Boot 1.x.y 。本次主要更新內容如下:

Spring Cloud Gateway

·       Support Rolling Deployments

·       Refresh routes from service discovery heart beat

Spring Cloud Netflix

·       Upgraded to Eureka 1.8.7 to address thread pool issue whenEureka health check is enabled

Spring Cloud Sleuth

·       Bug Fixes

·       Further Alignment With Brave

·       Fixed interop with Spring Cloud Gateway

Spring Cloud Contract

·       Added byte array for DSL

·       Better support for RestDocs parametrized names

·       Added exposure of multiple versions of the same artifact in the sametest

·       Added verbose messages for collection assertions in the generatedtests

·       Allows to keep unpacked stubs after the stubs got downloaded andtest finished

·       Added new overview sections to documentation

Spring Cloud Commons

·       Refactored APIs related to configuring Spring Retry

Spring Cloud Config

·       Adds ability to remove untracked local branches

·       Support YAML configuration for composite repos

Spring Cloud Stream

·       See Spring Cloud Stream release notes

 

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


@EnableEurekaServer
@SpringBootApplication
public class SpringclouddemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(SpringclouddemoApplication.class, args);
   }
}

 

3.4 eureka是一個高可用的元件,它沒有後端快取,每一個例項註冊之後需要向註冊中心傳送心跳(因此可以在記憶體中完成),在預設情況下erureka server也是一個eureka client ,必須要指定一個 server。eureka server的配置檔案appication.yml

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 

註釋:在專案構建的過程中application.properties是預設生成的配置檔案,我們可以使用appication.yml 更有層次感。

通過eureka.client.registerWithEureka:false和fetchRegistry:false來表明自己是一個eureka server.

 

3.5 eureka server 是有介面的,啟動工程,開啟瀏覽器訪問:

http://localhost:8761 ,介面如下:

No applicationavailable 沒有服務被發現 ,因為沒有註冊服務當然不可能有服務被發現了。

四、建立一個服務提供者 (eureka client)

當client向server註冊時,它會提供一些元資料,例如主機和埠,URL,主頁等。Eureka server 從每個client例項接收心跳訊息。 如果心跳超時,則通常將該例項從註冊server中刪除。

建立過程同server類似,通過註解@EnableEurekaClient表明自己是一個eurekaclient.

eureka client配置檔案appication.yml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8762
spring:
  application:
    name: springcloudclient

啟動專案:重新整理http://localhost:8761如圖可以看到:

你會發現一個服務已經註冊在服務中了,服務名為springcloudclient,埠為8762.

EMERGENCY! EUREKA MAY BEINCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSERTHAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

你可以看到上面有一段紅字,Eureka的自我保護模式

如果在Eureka Server的首頁看到以下這段提示,則說明Eureka已經進入了保護模式。

保護模式主要用於一組客戶端和Eureka Server之間存在網路分割槽場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。

註釋:Spring Cloud中,Eureka常見問題總結 看文:http://www.itmuch.com/spring-cloud-sum-eureka/

 

我們在springcloudclient 中建立一個demo,使用restful風格:

@RestController
public class HelloController {

    @Value("${server.port}")
    String port;
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(@RequestParam String name) {
        return "hello "+name+",i am from port:" +port;
    }
}

 

介面如下

 

此文章主要是自己用於學習,做的筆記,借鑑https://blog.csdn.net/forezp/article/details/69696915