天天看點

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

1.Spring Cloud快速入門

  • 初識 Spring Cloud
  • Spring Cloud 服務治理

2.初識Spring Cloud

2.1-微服架構

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

微服務架構:

"微服務”一詞源于 Martin Fowler的名為 Microservices的博文,可以在他的官方部落格上找到

http://martinfowler.com/articles/microservices.html

  • 微服務是系統架構上的一種設計風格,它的主旨是将一個原本獨立的系統拆分成多個小型服務,這些小型服務都在各自獨立的程序中運作,服務之間一般通過 HTTP 的 RESTfuLAPI 進行通信協作。
  • 被拆分成的每一個小型服務都圍繞着系統中的某一項或些耦合度較高的業務功能進行建構,并且每個服務都維護着自身的資料存儲、業務開發自動化測試案例以及獨立部署機

    制。

  • 由于有了輕量級的通信協作基礎,是以這些微服務可以使用

    不同的語言來編寫。

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

2.2-初識Spring Cloud

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
  • Spring Cloud 是一系列架構的有序集合。
  • Spring Cloud 并沒有重複制造輪子,它隻是将目前各家公司開發的比較成熟、經得起實際考驗的服務架構組合起來。
  • 通過 Spring Boot 風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
  • 它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、 斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。
  • Spring Cloud項目官方網址:https://spring.io/projects/spring-cloud
  • Spring Cloud 版本命名方式采用了倫敦地鐵站的名稱,同時根據字母表的順序來對應版本時間順序,比如:最早的Release版本:Angel,第二個Release版本:Brixton,然後是Camden、Dalston、Edgware,Finchley,Greenwich,Hoxton。
  • 目前最新的是Hoxton版本。
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

2.3-Spring Cloud 和dubbo對比

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

Spring Cloud 和dubbo對比

  • Spring Cloud 與 Dubbo 都是實作微服務有效的工具。
  • Dubbo 隻是實作了服務治理,而 Spring Cloud 子項目分别覆寫了微服務架構下的衆多部件。
  • Dubbo 使用 RPC 通訊協定,Spring Cloud 使用 RESTful 完成通信,Dubbo 效率略高于 Spring Cloud。

總結

  • 微服務就是将項目的各個子產品拆分為可獨立運作、部署、測試的架構設計風格。
  • Spring 公司将其他公司中微服務架構常用的元件整合起來,并使用 SpringBoot 簡化其開發、配置。

    稱為 Spring Cloud

  • Spring Cloud 與 Dubbo都是實作微服務有效的工具。Dubbo 性能更好,而 Spring Cloud 功能更全面。

3.Spring Cloud服務治理

3.1-Eureka介紹

• Eureka 是 Netflix 公司開源的一個服務注冊與發現的元件 。

• Eureka 和其他 Netflix 公司的服務元件(例如負載均衡、熔斷器、網關等) 一起,被 Spring Cloud 社群整合為

Spring-Cloud-Netflix 子產品。

• Eureka 包含兩個元件:Eureka Server (注冊中心) 和 Eureka Client (服務提供者、服務消費者)。

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

Eureka學習步驟

  1. 搭建 Provider 和 Consumer 服務。
  2. 使用 RestTemplate 完成遠端調用。
  3. 搭建 Eureka Server 服務。
  4. 改造 Provider 和 Consumer 稱為 Eureka Client。
  5. Consumer 服務 通過從 Eureka Server 中抓取 Provider

    位址 完成 遠端調用

3.2-Eureka快速入門

3.2.1-環境搭建

3.2.1.1-建立父工程

建立module -父工程 Spring-cloud-parent

  • 建立後的目錄結構(删除src)

Spring-cloud-parent pom.xml

<!--spring boot 環境 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/>
    </parent>


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

3.2.1.2-建立服務提供者

  • 建立服務提供者eureka-provider

eureka-provider pom.xml

<dependencies>

        <!--spring boot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>
           

GoodsController

package com.example.provider.controller;

import com.example.provider.domain.Goods;
import com.example.provider.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Goods Controller 服務提供方
 */

@RestController
@RequestMapping("/goods")
public class GoodsController {

    @Autowired
    private GoodsService goodsService;

    @GetMapping("/findOne/{id}")
    public Goods findOne(@PathVariable("id") int id){

        Goods goods = goodsService.findOne(id);

        return goods;
    }
}

           

GoodsService

package com.example.provider.service;

import com.example.provider.dao.GoodsDao;
import com.example.provider.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Goods 業務層
 */
@Service
public class GoodsService {

    @Autowired
    private GoodsDao goodsDao;


    /**
     * 根據id查詢
     * @param id
     * @return
     */
    public Goods findOne(int id){
        return goodsDao.findOne(id);
    }
}

           

Goods

package com.example.provider.domain;

/**
 * 商品實體類
 */
public class Goods {

    private int id;
    private String title;//商品标題
    private double price;//商品價格
    private int count;//商品庫存

    public Goods() {
    }

    public Goods(int id, String title, double price, int count) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.count = count;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

           

GoodsDao

package com.example.provider.dao;

import com.example.provider.domain.Goods;
import org.springframework.stereotype.Repository;

import javax.validation.ReportAsSingleViolation;

/**
 * 商品Dao
 */

@Repository
public class GoodsDao {


    public Goods findOne(int id){
        return new Goods(1,"華為手機",3999,10000);
    }
}

           

ProviderApp

package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 啟動類
 */

@SpringBootApplication
public class ProviderApp {


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

           

application.yml

server:
  port: 8000
           

3.2.1.2-建立服務消費者

  • 建立服務消費者eureka-consumer
  • 最終目錄結構

OrderController

package com.example.consumer.controller;


import com.example.consumer.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 服務的調用方
 */

@RestController
@RequestMapping("/order")
public class OrderController {

    @GetMapping("/goods/{id}")
    public Goods findGoodsById(@PathVariable("id") int id){
        System.out.println("findGoodsById..."+id);


		//遠端調用Goods服務中的findOne接口
        return null;
    }
}

           

Goods

package com.example.consumer.domain;

/**
 * 商品實體類
 */
public class Goods {

    private int id;
    private String title;//商品标題
    private double price;//商品價格
    private int count;//商品庫存

    public Goods() {
    }

    public Goods(int id, String title, double price, int count) {
        this.id = id;
        this.title = title;
        this.price = price;
        this.count = count;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

           

ConsumerApp

package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumerApp {


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

           

application.yml

server:
  port: 9000
           

3.2.2-RestTemplate遠端調用

• Spring提供的一種簡單便捷的模闆類,用于在 java 代碼裡通路 restful 服務。

• 其功能與 HttpClient 類似,但是 RestTemplate 實作更優雅,使用更友善。

修改消費方代碼

RestTemplateConfig

package com.example.consumer.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {


    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

           

OrderController

package com.example.consumer.controller;


import com.example.consumer.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 服務的調用方
 */

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/goods/{id}")
    public Goods findGoodsById(@PathVariable("id") int id){
        System.out.println("findGoodsById..."+id);
        /*
            //遠端調用Goods服務中的findOne接口
            使用RestTemplate
            1. 定義Bean  restTemplate
            2. 注入Bean
            3. 調用方法
         */

        String url = "http://localhost:8000/goods/findOne/"+id;
        // 3. 調用方法
        Goods goods = restTemplate.getForObject(url, Goods.class);
        return goods;
    }
}

           

3.2.3- Eureka Server搭建

① 建立 eureka-server 子產品

② 引入 SpringCloud 和 euraka-server 相關依賴

Spring-cloud-parent pom.xml

<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 版本-->
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
    </properties>

    <!--引入Spring Cloud 依賴-->
    <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>
           

eureka-server pom.xml

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

EurekaApp

package com.example.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
// 啟用EurekaServer
@EnableEurekaServer
public class EurekaApp {

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


           

③ 完成 Eureka Server 相關配置

application.yml

server:
  port: 8761

# eureka 配置
# eureka 一共有4部分 配置
# 1. dashboard:eureka的web控制台配置
# 2. server:eureka的服務端配置
# 3. client:eureka的用戶端配置
# 4. instance:eureka的執行個體配置


eureka:
  instance:
    hostname: localhost # 主機名
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服務端位址,将來用戶端使用該位址和eureka進行通信

    register-with-eureka: false # 是否将自己的路徑 注冊到eureka上。eureka server 不需要的,eureka provider client 需要
    fetch-registry: false # 是否需要從eureka中抓取路徑。eureka server 不需要的,eureka consumer client 需要


           

④ 啟動該子產品

3.2.4-Eureka控制台介紹

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

System status:系統狀态資訊

DS Replicas:叢集資訊

tance currently registered with Eureka: 執行個體注冊資訊

General Info :通用資訊

Instance Info :執行個體資訊

3.2.5-Eureka Client

① 引 eureka-client 相關依賴

eureka-provider pom.xml

<dependencies>

        <!--spring boot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- eureka-client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>

           

ProviderApp

package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 啟動類
 */

@EnableEurekaClient //該注解 在新版本中可以省略
@SpringBootApplication
public class ProviderApp {


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


           

② 完成 eureka client 相關配置

application.yml

server:
  port: 8001


eureka:
  instance:
    hostname: localhost # 主機名
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka # eureka服務端位址,将來用戶端使用該位址和eureka進行通信
spring:
  application:
    name: eureka-provider # 設定目前應用的名稱。将來會在eureka中Application顯示。将來需要使用該名稱來擷取路徑


           

③ 啟動 測試

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

服務消費者eureka-consumer通過修改,也可以展示在控制台

eureka-consumer在這裡僅僅是我們人為定義為消費者,作為一個服務,其實既可以作為服務提供方,同時也可以作為服務消費方

ConsumerApp添加@EnableEurekaClient

package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


@EnableEurekaClient
@SpringBootApplication
public class ConsumerApp {


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


           

application.yml

server:
  port: 9000


eureka:
  instance:
    hostname: localhost # 主機名
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka # eureka服務端位址,将來用戶端使用該位址和eureka進行通信
spring:
  application:
    name: eureka-consumer # 設定目前應用的名稱。将來會在eureka中Application顯示。将來需要使用該名稱來擷取路徑


           
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.2.6- 動态擷取路徑

ConsumerApp添加@EnableDiscoveryClient

package com.example.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableDiscoveryClient // 激活DiscoveryClient
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class,args);
    }
}

           

OrderController修改代碼動态擷取路徑

package com.example.consumer.controller;


import com.example.consumer.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * 服務的調用方
 */

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/goods/{id}")
    public Goods findGoodsById(@PathVariable("id") int id){
        System.out.println("findGoodsById..."+id);


        /*
            //遠端調用Goods服務中的findOne接口
            使用RestTemplate
            1. 定義Bean  restTemplate
            2. 注入Bean
            3. 調用方法
         */

        /*
            動态從Eureka Server 中擷取 provider 的 ip 和端口
             1. 注入 DiscoveryClient 對象.激活
             2. 調用方法
         */

        //示範discoveryClient 使用
       List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA-PROVIDER");

        //判斷集合是否有資料
        if(instances == null || instances.size() == 0){
            //集合沒有資料
            return null;
        }

        ServiceInstance instance = instances.get(0);
        String host = instance.getHost();//擷取ip
        int port = instance.getPort();//擷取端口

        System.out.println(host);
        System.out.println(port);

        String url = "http://"+host+":"+port+"/goods/findOne/"+id;
        // 3. 調用方法
        Goods goods = restTemplate.getForObject(url, Goods.class);


        return goods;
    }
}


           

3.3-Eureka屬性

3.3.1-instance相關屬性

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

Eureka Instance的配置資訊全部儲存在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean配置類裡,實際上它是com.netflix.appinfo.EurekaInstanceConfig的實作類,替代了netflix的com.netflix.appinfo.CloudInstanceConfig的預設實作。

Eureka Instance的配置資訊全部以eureka.instance.xxx的格式配置。

配置清單

  • appname = unknown

應用名,首先擷取spring.application.name的值,如果取值為空,則取預設unknown。

  • appGroupName = null

應用組名

  • instanceEnabledOnit = false

執行個體注冊到Eureka上是,是否立刻開啟通訊。有時候應用在準備好服務之前需要一些預處理。

  • nonSecurePort = 80

非安全的端口

  • securePort = 443

安全端口

  • nonSecurePortEnabled = true

是否開啟非安全端口通訊

  • securePortEnabled = false

是否開啟安全端口通訊

  • leaseRenewalIntervalInSeconds = 30

執行個體續約間隔時間

  • leaseExpirationDurationInSeconds = 90

執行個體逾時時間,表示最大leaseExpirationDurationInSeconds秒後沒有續約,Server就認為他不可用了,随之就會将其剔除。

  • virtualHostName = unknown

虛拟主機名,首先擷取spring.application.name的值,如果取值為空,則取預設unknown。

  • instanceId

注冊到eureka上的唯一執行個體ID,不能與相同appname的其他執行個體重複。

  • secureVirtualHostName = unknown

安全虛拟主機名,首先擷取spring.application.name的值,如果取值為空,則取預設unknown。

  • metadataMap = new HashMap();

執行個體中繼資料,可以供其他執行個體使用。比如spring-boot-admin在監控時,擷取執行個體的上下文和端口。

  • dataCenterInfo = new MyDataCenterInfo(DataCenterInfo.Name.MyOwn);

執行個體部署的資料中心。如AWS、MyOwn。

  • ipAddress=null

執行個體的IP位址

  • statusPageUrlPath = “/actuator/info”

執行個體狀态頁相對url

  • statusPageUrl = null

執行個體狀态頁絕對URL

  • homePageUrlPath = “/”

執行個體首頁相對URL

  • homePageUrl = null

執行個體首頁絕對URL

  • healthCheckUrlUrlPath = “/actuator/health”

執行個體健康檢查相對URL

  • healthCheckUrl = null

執行個體健康檢查絕對URL

  • secureHealthCheckUrl = null

執行個體安全的健康檢查絕對URL

  • namespace = “eureka”

配置屬性的命名空間(Spring Cloud中被忽略)

  • hostname = null

主機名,不配置的時候講根據作業系統的主機名來擷取

  • preferIpAddress = false

是否優先使用IP位址作為主機名的辨別

3.3.1-server相關屬性

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

Eureka Server注冊中心端的配置是對注冊中心的特性配置。Eureka Server的配置全部在org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean裡,實際上它是com.netflix.eureka.EurekaServerConfig的實作類,替代了netflix的預設實作。

Eureka Server的配置全部以eureka.server.xxx的格式進行配置。

配置清單

  • enableSelfPreservation=true

是否開啟自我保護

  • renewalPercentThreshold = 0.85

自我保護續約百分比閥值因子。如果實際續約數小于續約數閥值,則開啟自我保護

  • renewalThresholdUpdateIntervalMs = 15 * 60 * 1000

續約數閥值更新頻率。

  • peerEurekaNodesUpdateIntervalMs = 10 * 60 * 1000

Eureka Server節點更新頻率。

  • enableReplicatedRequestCompression = false

是否啟用複制請求壓縮。

  • waitTimeInMsWhenSyncEmpty=5 * 60 * 1000

當從其他節點同步執行個體資訊為空時等待的時間。

  • peerNodeConnectTimeoutMs=200

節點間連接配接的逾時時間。

  • peerNodeReadTimeoutMs=200

節點間讀取資訊的逾時時間。

  • peerNodeTotalConnections=1000

節點間連接配接總數。

  • peerNodeTotalConnectionsPerHost = 500;

單個節點間連接配接總數。

  • peerNodeConnectionIdleTimeoutSeconds = 30;

節點間連接配接空閑逾時時間。

  • retentionTimeInMSInDeltaQueue = 3 * MINUTES;

增量隊列的緩存時間。

  • deltaRetentionTimerIntervalInMs = 30 * 1000;

清理增量隊列中過期的頻率。

  • evictionIntervalTimerInMs = 60 * 1000;

剔除任務頻率。

  • responseCacheAutoExpirationInSeconds = 180;

注冊清單緩存逾時時間(當注冊清單沒有變化時)

  • responseCacheUpdateIntervalMs = 30 * 1000;

注冊清單緩存更新頻率。

  • useReadOnlyResponseCache = true;

是否開啟注冊清單的二級緩存。

  • disableDelta=false。

是否為client提供增量資訊。

  • maxThreadsForStatusReplication = 1;

狀态同步的最大線程數。

  • maxElementsInStatusReplicationPool = 10000;

狀态同步隊列的最大容量。

  • syncWhenTimestampDiffers = true;

當時間差異時是否同步。

  • registrySyncRetries = 0;

注冊資訊同步重試次數。

  • registrySyncRetryWaitMs = 30 * 1000;

注冊資訊同步重試期間的時間間隔。

  • maxElementsInPeerReplicationPool = 10000;

節點間同步事件的最大容量。

  • minThreadsForPeerReplication = 5;

節點間同步的最小線程數。

  • maxThreadsForPeerReplication = 20;

節點間同步的最大線程數。

  • maxTimeForReplication = 30000;

節點間同步的最大時間,機關為毫秒。

  • disableDeltaForRemoteRegions = false;

是否啟用遠端區域增量。

  • remoteRegionConnectTimeoutMs = 1000;

遠端區域連接配接逾時時間。

  • remoteRegionReadTimeoutMs = 1000;

遠端區域讀取逾時時間。

  • remoteRegionTotalConnections = 1000;

遠端區域最大連接配接數

  • remoteRegionTotalConnectionsPerHost = 500;

遠端區域單機連接配接數

  • remoteRegionConnectionIdleTimeoutSeconds = 30;

遠端區域連接配接空閑逾時時間。

  • remoteRegionRegistryFetchInterval = 30;

遠端區域注冊資訊拉取頻率。

  • remoteRegionFetchThreadPoolSize = 20;

遠端區域注冊資訊線程數。

3.4-Eureka高可用

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
  1. 準備兩個Eureka Server
  2. 分别進行配置,互相注冊
  3. Eureka Client 分别注冊到這兩個 Eureka Server中

3.4.1-搭建

建立eureka-server-1

pom.xml

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    </dependencies>

           

application.yml

server:
  port: 8761


eureka:
  instance:
    hostname: eureka-server1 # 主機名
  client:
    service-url:
      defaultZone: http://eureka-server2:8762/eureka
    register-with-eureka: true # 是否将自己的路徑 注冊到eureka上。eureka server 不需要的,eureka provider client 需要
    fetch-registry: true # 是否需要從eureka中抓取路徑。eureka server 不需要的,eureka consumer client 需要


spring:
  application:
    name: eureka-server-ha

           

Eureka1App

package eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
// 啟用EurekaServer
@EnableEurekaServer
public class Eureka1App {

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

    }
}


           

建立eureka-server-2

pom.xml

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

    </dependencies>

           

application.yml

server:
  port: 8762


eureka:
  instance:
    hostname: eureka-server2 # 主機名
  client:
    service-url:
      defaultZone: http://eureka-server1:8761/eureka

    register-with-eureka: true # 是否将自己的路徑 注冊到eureka上。eureka server 不需要的,eureka provider client 需要
    fetch-registry: true # 是否需要從eureka中抓取路徑。eureka server 不需要的,eureka consumer client 需要
spring:
  application:
    name: eureka-server-ha


           

Eureka2App

package eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
// 啟用EurekaServer
@EnableEurekaServer
public class Eureka2App {

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

    }
}


           

修改本地host

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.4.2-用戶端測試

修改服務提供者和服務消費者配置檔案中的注冊服務位址

eureka-provider application.yml

server:
  port: 8001


eureka:
  instance:
    hostname: localhost # 主機名
    prefer-ip-address: true # 将目前執行個體的ip注冊到eureka server 中。預設是false 注冊主機名
    ip-address: 127.0.0.1 # 設定目前執行個體的ip
    instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 設定web控制台顯示的 執行個體id
    lease-renewal-interval-in-seconds: 3 # 每隔3 秒發一次心跳包
    lease-expiration-duration-in-seconds: 9 # 如果9秒沒有發心跳包,伺服器呀,你把我幹掉吧~
  client:
    service-url:
      defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服務端位址,将來用戶端使用該位址和eureka進行通信
spring:
  application:
    name: eureka-provider # 設定目前應用的名稱。将來會在eureka中Application顯示。将來需要使用該名稱來擷取路徑



           

eureka-consumer application.yml

server:
  port: 9000


eureka:
  instance:
    hostname: localhost # 主機名
  client:
    service-url:
      defaultZone:  http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka  # eureka服務端位址,将來用戶端使用該位址和eureka進行通信
spring:
  application:
    name: eureka-consumer # 設定目前應用的名稱。将來會在eureka中Application顯示。将來需要使用該名稱來擷取路徑


           

測試結果

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.5-Consul

3.5.1-Consul 概述

Consul 是由 HashiCorp 基于 Go 語言開發的,支援多資料中心,分布式高可用的服務釋出和注冊服務軟體。

• 用于實作分布式系統的服務發現與配置。

• 使用起來也較 為簡單。具有天然可移植性(支援Linux、windows和Mac OS X);安裝包僅包含一個可執行檔案,

友善部署 。

• 官網位址: https://www.consul.io

啟動consul

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

dev模式:不會持久化資料

啟動成功

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

控制台

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.5.2-Consul 快速入門

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理
  1. 搭建 Provider 和 Consumer 服務。
  2. 使用 RestTemplate 完成遠端調用。
  3. 将Provider服務注冊到Consul中。
  4. Consumer 服務 通過從 Consul 中抓取 Provider 地

    址 完成 遠端調用

Provider pom.xml

<dependencies>

        <!--consul 用戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-actuator</artifactId>
        </dependency>

    </dependencies>

           

application.yml

server:
  port: 8000
spring:
  cloud:
    consul:
      host: localhost # consul 服務端的 ip
      port: 8500 # consul 服務端的端口 預設8500
      discovery:
        service-name: ${spring.application.name} # 目前應用注冊到consul的名稱
        prefer-ip-address: true # 注冊ip

  application:
    name: consul-provider # 應用名稱


           

consumer pom.xml

<dependencies>
        <!--consul 用戶端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-actuator</artifactId>
        </dependency>

    </dependencies>

           

application.yml

server:
  port: 9000


spring:
  cloud:
    consul:
      host: localhost # consul 服務端的 ip
      port: 8500 # consul 服務端的端口 預設8500
      discovery:
        service-name: ${spring.application.name} # 目前應用注冊到consul的名稱
        prefer-ip-address: true # 注冊ip

  application:
    name: consul-consumer # 應用名稱


           

OrderController

package com.example.consul.controller;


import com.example.consul.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * 服務的調用方
 */

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/goods/{id}")
    public Goods findGoodsById(@PathVariable("id") int id){
        //示範discoveryClient 使用
        List<ServiceInstance> instances = discoveryClient.getInstances("consul-PROVIDER");

        //判斷集合是否有資料
        if(instances == null || instances.size() == 0){
            //集合沒有資料
            return null;
        }

        ServiceInstance instance = instances.get(0);
        String host = instance.getHost();//擷取ip
        int port = instance.getPort();//擷取端口

        System.out.println(host);
        System.out.println(port);

        String url = "http://"+host+":"+port+"/goods/findOne/"+id;
        // 3. 調用方法
        Goods goods = restTemplate.getForObject(url, Goods.class);


        return goods;
    }
}


           
Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.6-Nacos

3.6.1-Nacos 概述

Nacos(Dynamic Naming and Configuration Service) 是阿裡巴巴2018年7月開源的項目。

• 它專注于服務發現和配置管理領域 緻力于幫助您發現、配置和管理微服務。Nacos 支援幾乎所有主流類型的“服

務”的發現、配置和管理。

• 一句話概括就是Nacos = Spring Cloud注冊中心 + Spring Cloud配置中心。

• 官網:https://nacos.io/

• 下載下傳位址: https://github.com/alibaba/nacos/releases

啟動

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

啟動成功效果:

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

控制台登入

賬号,密碼:nacos

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

控制台頁面

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

Spring cloud Alibaba 元件

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

3.6.2-Nacos 快速入門

nacos-provider pom.xml

<dependencies>

        <!--nacos-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.1.0</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-actuator</artifactId>
        </dependency>



    </dependencies>

           

application.yml

server:
  port: 8000
spring:
  cloud:
    nacos:
      discovery:
        server-addr:  127.0.0.1:8848 # 配置nacos 服務端位址
  application:
    name: nacos-provider # 服務名稱


           

nacos consumer pom.xml

<dependencies>

        <!--nacos-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.1.0</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-actuator</artifactId>
        </dependency>



    </dependencies>

           

application.yml

server:
  port: 9000


spring:
  cloud:
    nacos:
      discovery:
        server-addr:  127.0.0.1:8848 # 配置nacos 服務端位址
  application:
    name: nacos-consumer # 服務名稱


           

控制台顯示

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

詳情頁面

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理

示例代碼

Spring Cloud概述、快速入門1.Spring Cloud快速入門2.初識Spring Cloud3.Spring Cloud服務治理