文章目录

服务治理SpringCloud Eureka

什么是服务治理

在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

服务注册与发现

​ 在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息 比如 服务通讯地址等以别名方式注册到注册中心上。
另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地rpc调用远程。

搭建注册中心

1. 创建 springcloud-2.0-eureka-server maven模块

2. pom文件添加maven依赖信息

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.M7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!--SpringCloud eureka-server -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

3. 创建application.yml

###eureka 服务端口号
server:
  port: 8100
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-eureka
###服务注册名称
eureka:
  instance:
    ###注册中心IP地址
    hostname: 127.0.0.1
  ###客户端调用地址
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    ###因为该应用为注册中心,不需要注册自己(集群的时候需要置为true)
    register-with-eureka: false
    ###因为自己为注册中心 ,不需要检索服务信息(集群的时候需要置为true)
    fetch-registry: false

4. 创建 SpringBoot启动类

package com.iymayiedu;

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

// @EnableEurekaServer作用: 开启EurekaServer
@SpringBootApplication
@EnableEurekaServer
public class AppEureka9100 {
    public static void main(String[] args) {
        SpringApplication.run(AppEureka9100.class, args);
    }
}

5. 启动并浏览器访问如下地址

http://localhost:8100/

[外链图片转存失败(img-o0hPfXiM-1568858545906)(images/1568790712778.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_zookeeper

创建注册服务提供者

项目案例:

以下仅用会员服务及订单服务举例

场景为 获取订单信息时 订单服务需要调用会员服务进行获取会员相关数据

​ 实现会员服务(服务提供者) springcloud-2.0-member

​ 实现订单服务(服务消费者) springcloud-2.0-order

1. 创建 springcloud-2.0-member maven模块

2. pom文件添加maven依赖信息

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.M7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- SpringBoot整合eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

3. 创建application.yml

###服务启动端口号
server:
  port: 8010
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-member
###服务注册到eureka地址
eureka:
  client:
    service-url:
      ###当前会员服务注册到Eureka服务地址
      defaultZone: http://127.0.0.1:8100/eureka
    ###在注册中心上注册该服务
    register-with-eureka: true
    ###需要从eureka上获取注册信息
    fetch-registry: true

4. 创建 SpringBoot启动类

package com.itmayiedu.api.controller;

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


// @Ena|bleEurekaClient 表示将当前服务注册到Eureka上
@SpringBootApplication
@EnableEurekaClient
public class AppMember {

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

5. 启动并浏览器访问Euraka注册中心

[外链图片转存失败(img-o65fZ76M-1568858545907)(images/1568794099108.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_spring_02
可以看到会员服务成功注册到Eureka注册中心上

创建注册服务消费者

1. 创建 springcloud-2.0-order maven模块

2. pom文件添加maven依赖信息

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.M7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- SpringBoot整合eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>

</dependencies>
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

3. 创建application.yml

###订单服务启动端口号
server:
  port: 8011
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-order
###服务注册到eureka地址
eureka:
  client:
    service-url:
      ###当前订单服务注册到Eureka服务地址
      defaultZone: http://127.0.0.1:8100/eureka
    ###在注册中心上注册该服务
    register-with-eureka: true
    ###需要从eureka上获取注册信息
    fetch-registry: true

4. 使用rest方式调用服务

4.1在order模块中创建OrderController.java 写测试类

package com.itmayiedu.api.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class OrderController {

    // RestTemplate 是有SpringBoot Web组件提供 默认整合ribbon负载均衡器
    // rest方式底层是采用httpclient技术
    @Autowired
    private RestTemplate restTemplate;


    /**
     * 在SpringCloud 中有两种方式调用 rest、fegin(SpringCloud)
     *
     * @return
     */

    // 完成订单服务 调用会员服务
    @RequestMapping("/getOrder")
    public String getOrder(){
        // 有两种方式,一种是采用服务别名方式调用,另一种是直接调用 使用别名去注册中心上获取对应的服务调用地址
        String url = "http://app-itmayiedu-member/getMember";
        String result = restTemplate.getForObject(url, String.class);
        System.out.println("订单服务调用会员服务result:" + result);
        return result;
    }
}

4.2在会员模块中创建MemberApiController.java 写测试类

package com.itmayiedu.api.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MemberApiController {

    @Value("${server.port}")
    private String serverPort;


    @RequestMapping("/getMember")
    public String getMember () {
        return "this is member, 我是会员服务, 端口号为:" + serverPort;
    }
}

5. 创建 SpringBoot启动类

package com.itmayiedu.api.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class AppOrder {
    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class, args);

        // 如果使用rest方式以别名方式进行调用依赖ribbon负载均衡器 @LoadBalanced
        // @LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
    }

    // 解决RestTemplate 找不到原因 应该把restTemplate注册SpringBoot容器中 @bean
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

6.启动消费者服务

顺序应该为 先启动注册中心 然后启动服务者服务(member服务),最后启动消费者服务(order服务)

7. 访问消费者服务测试接口地址

http://localhost:8011/getOrder

[外链图片转存失败(img-Q4XBr6OY-1568858545907)(images/1568794680970.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_spring_03

由此可见 消费者调用服务者成功 成功在浏览器打印输出了服务者接口中的相关结果

高可用注册中心

在微服务中,注册中心非常核心,可以实现服务治理,如果一旦注册出现故障的时候,可能会导致整个微服务无法访问,在这时候就需要对注册中心实现高可用集群模式。

Eureka高可用原理

默认情况下Eureka是让服务注册中心,不注册自己

Eureka高可用实际上将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组相互注册的服务注册中心,从而实现服务清单的互相同步,达到高可用效果。

打开Euraka注册中心服务模块→目录Resource→application.yml 修改为如下

	### 注册中心, 注册自己
    register-with-eureka: true
    ### 去在该应用中的检测服务
    fetch-registry: true

Eureka集群环境搭建

Eureka01配置

###eureka 服务端口号
server:
  port: 8100
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-eureka
###服务注册名称
eureka:
  instance:
    ###注册中心IP地址
    hostname: 127.0.0.1
  ###客户端调用地址
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8200/eureka/
    ###因为该应用为注册中心,不会注册自己
    register-with-eureka: true
    ###因为自己为注册中心 ,不会去在该应用中的检测服务
    fetch-registry: true

Eureka02配置

###eureka 服务端口号
server:
  port: 8200
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-eureka
###服务注册名称
eureka:
  instance:
    ###注册中心IP地址
    hostname: 127.0.0.1
  ###客户端调用地址
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8100/eureka/
    ###因为该应用为注册中心,不会注册自己
    register-with-eureka: true
    ###因为自己为注册中心 ,不会去在该应用中的检测服务
    fetch-registry: true

注意注册中心一定要有服务名称,且多个互相注册的注册中心的服务名称一定要相同!

客户端集成Eureka集群

###服务启动端口号
server:
  port: 8010
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-member
###服务注册到eureka地址
eureka:
  client:
    service-url:
      ###当前会员服务注册到Eureka服务地址
      defaultZone: http://127.0.0.1:8100/eureka,http://127.0.0.1:8200/eureka
    ###需要将当前服务注册到Eureka服务上
    register-with-eureka: true
    ###是否需要从eureka上获取注册信息
    fetch-registry: true

启动Euraka1注册中心、启动Euraka2注册中心 访问Eureka1注册中心 可发现 Euraka2服务在该注册中心上 ,

访问Eureka2注册中心 可发现 Euraka1服务在该注册中心上

[外链图片转存失败(img-iXljDff5-1568858545908)(images/1568797354520.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_端口号_04
[外链图片转存失败(img-TJcCdPb3-1568858545908)(images/1568797368778.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_spring_05

启动会员服务 查看注册中心如下

[外链图片转存失败(img-FqLdPEga-1568858545908)(images/1568797472019.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_端口号_06

尝试关闭8100注册中心 依旧可以访问会员服务的接口 http://localhost:8010/getMember

可见Eureka集群环境搭建成功!

Eureka详解

服务消费者模式

获取服务

​ 消费者启动的时候,使用服务别名,会发送一个rest请求到服务注册中心获取对应的服务信息,然后会缓存到本地jvm客户端中,同时客户端每隔30秒从服务器上更新一次。

可以通过 fetch-inte vall-seconds=30参数进行修以通过eureka.client .registry该参数默认值为30, 单位为秒。

服务下线

​ 在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭期有我们自然不希望客户端会继续调用关闭了的实例。所以在客户端程序中,当服务实例过正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务日中心:“我要下线了”。服务端在接收到请求之后,将该服务状态置为下线(DOWN),井该下线事件传播出去。

服务注册模式

失效剔除

​ 有些时候,我们的服务实例并不一定会正常下线,可能由于内存溢出、网络故障气因使得服务不能正常工作,而服务注册中心并未收到“服务下线”的请求。为了从服务表中将这些无法提供服务的实例剔除,Eureka Server 在启动的时候会创建一个定时任务默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务除出去

自我保护

当我们在本地调试基于Eureka的程序时,基本上都会碰到这样-一个问题, 在服务主中心的信息面板中出现类似下面的红色警告信息( )

为什么会产生自我保护机制
为了防止EurekaClient可以正常运行,但是与EurekaServer网络不通的情况下,EurekaServer不会将EurekaClient服务进行剔除

[外链图片转存失败(img-uRNRPL7J-1568858545908)(images/1568797932574.png)]

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY 'RERENENALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIREDTO BE SAFE.

SpringCloud→服务治理SpringCloud Eureka(二)_客户端_07

实际上,该警告就是触发了Eureka Server的自我保护机制。之前我们介绍过,服务注册到Eureka Server之后,会维护个心跳连接, 告诉Eureka Server自己还活 着。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%如果出现低于的情况单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),EurekaServer会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信-息。但是,在这段保护期间内实例若出现问题,那么客户端很容易拿到实际已经不存服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请使用重试、断路器等机制。

由于本地调试很容易触发注册中心的保护机制,这会使得注册中心维护的服务实仍那么准确。所以,我们在本地进行开发的时候,可以使用eureka . server . enable-self-preservation=false参数来关闭保护机制,以确保注册中心可以将不可用的例正确剔除。

关闭服务保护

Eureka服务器端配置

###服务端口号
server:
  port: 8100
###eureka 基本信息配置
spring:
  application:
    name: eureka-server
eureka:
  instance:
    ###注册到eurekaip地址
    hostname: 127.0.0.1
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:8100/eureka/
    ###因为自己是为注册中心,不需要自己注册自己
    register-with-eureka: true
    ###因为自己是为注册中心,不需要检索服务
    fetch-registry: true
  server:
    # 测试时关闭自我保护机制,保证不可用服务及时踢出
    enable-self-preservation: false
    ##剔除失效服务间隔
    eviction-interval-timer-in-ms: 2000

核心配置

server:
    # 测试时关闭自我保护机制,保证不可用服务及时踢出
    enable-self-preservation: false
    ##剔除失效服务间隔
    eviction-interval-timer-in-ms: 2000

Eureka客户端配置

###服务启动端口号
server:
  port: 8010
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: app-itmayiedu-member
###服务注册到eureka地址
eureka:
  client:
    service-url:
#      defaultZone: http://localhost:8100/eureka,http://localhost:8200/eureka
      defaultZone: http://localhost:8100/eureka
    ###因为该应用为注册中心,不会注册自己
    register-with-eureka: true
    ###是否需要从eureka上获取注册信息
    fetch-registry: true
    # 心跳检测检测与续约时间
    # 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
    instance:
      ###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
      lease-renewal-interval-in-seconds: 1
      ####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
      lease-expiration-duration-in-seconds: 2

核心配置

# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
  instance:
###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)  
    lease-renewal-interval-in-seconds: 1
####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
    lease-expiration-duration-in-seconds: 2    

当服务真的宕机呢?
本地调试应该重试机制、保证接口网络延迟幂等性、服务降级功能(友好提示给客户端).

使用Consul来替换Eureka

Consul简介

Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。

它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows

Consul 整合SpringCloud 学习网站: https://springcloud.cc/spring-cloud-consul.html

Consul下载地址 https://www.consul.io/downloads.html

Consul环境搭建

官方下载地址下载window版,解压得到一个可执行文件。
设置环境变量,让我们直接在cmd里可直接使用consul命令。在path后面添加consul所在目录例如D:\soft\consul_1.1.0_windows_amd64

启动consul命令

consul agent -dev -ui -node=cy

-dev开发服务器模式启动,-node结点名为cy,-ui可以用界面访问,默认能访问。

测试访问地址:http://localhost:8500

[外链图片转存失败(img-cAgGPZvB-1568858545908)(images/1568798464107.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_zookeeper_08

Consul客户端

Maven依赖信息
<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>
	<!-- 管理依赖 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.M7</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<!-- SpringBoot整合Web组件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--SpringCloud consul-server -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-consul-discovery</artifactId>
		</dependency>
	</dependencies>
	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/libs-milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
客户端配置文件
###consul 服务端口号
server:
  port: 8502
spring:
  application:
    ###服务名称
    name: consul-member
  ####consul注册中心地址
  cloud:
    consul:
      ### consul地址
      host: localhost
      ### consul端口号
      port: 8500
      discovery:
        ###服务地址直接为一个确定的ip 而不是默认的类似于 PC-bd2star之类的
        hostname: 192.168.18.220

#### 默认情况下  服务注册到注册中心 地址随机生成英文PC-bd2star之类的
#### 换不通注册中心的时候  接口调用方式都不变的 无非变化配置文件和maven依赖信息

创建 SpringBoot 启动类

package controller;

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

//@EnableDiscoveryClient 的作用是 如果服务使用connsul、zookeeper使用 @EnableDiscoveryClient该注解 会向注册中心上注册服务
@SpringBootApplication
@EnableDiscoveryClient
public class AppMember {

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

}

添加测试类 MemberController.java

package controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class MemberController {

    // discoveryClient接口  可以获取注册中心上的实例信息。
    @Autowired
    private DiscoveryClient discoveryClient;

    @Value("${server.port}")
    private String serverProt;

    @RequestMapping("/getMember")
    public String getMember() {
        return "this is getMember" + serverProt;
    }

	// 获取注册中心上信息
    @RequestMapping("/getServiceUrl")
    public List<String> getServiceUrl() {
        List<ServiceInstance> list = discoveryClient.getInstances("consul-member");
        List<String> services = new ArrayList<>();
        for (ServiceInstance serviceInstance : list) {
            if (serviceInstance != null) {
                services.add(serviceInstance.getUri().toString());
            }
        }
        return services;
    }
}

浏览器访问

[外链图片转存失败(img-N0tugOyt-1568858545909)(images/1568799382134.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_端口号_09
[外链图片转存失败(img-1TEMKaRV-1568858545909)(images/1568799400842.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_端口号_10

@EnableDiscoveryClient 与@EnableEurekaClient区别

  1. @EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现; 适合于consul、zookeeper注册中心;

  2. @EnableEurekaClient注解是基于spring-cloud-netflix依赖,只能为eureka作用;

使用Zookeeper来替换Eureka

Zookeeper简介

​ Zookeeper是一个分布式协调工具,可以实现服务注册与发现、注册中心、消息中间件、分布式配置中心等。

Zookeeper节点类型:
采用 临时节点

环境搭建

启动zk服务器端

Maven依赖信息

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>
	<!-- 管理依赖 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.M7</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<!-- SpringBoot整合Web组件 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- SpringBoot整合zookeeper客户端 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
		</dependency>

	</dependencies>
	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/libs-milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

application.yml

会员配置文件

###会员服务的端口号
server:
  port: 8080
###服务别名----服务注册到注册中心名称
spring:
  application:
    name: zk-member
  cloud:
    zookeeper:
      ###注册到Zookeeper的地址
      connect-string: 127.0.0.1:2181

订单配置文件

###会员服务的端口号
server:
  port: 8001
###服务别名----服务注册到注册中心名称
spring:
  application:
    name: zk-order
  cloud:
    zookeeper:
      ###注册到Zookeeper的地址
      connect-string: 127.0.0.1:2181

启动zk-member服务和zk-order服务,可以发现在Zk服务器端上有对应的节点信息

[外链图片转存失败(img-A2kKXvBA-1568858545909)(images/1568800097933.png)]
SpringCloud→服务治理SpringCloud Eureka(二)_端口号_11

Zookeeper与Eureka区别

彻底分布式Zookeeper与Eureka区别(在上分布式事务的时候重点讲)