SpringCloud→服务治理SpringCloud Eureka(二)

服务治理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-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)]
在这里插入图片描述
可以看到会员服务成功注册到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)]
在这里插入图片描述

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

高可用注册中心

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

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)]
在这里插入图片描述
[外链图片转存失败(img-TJcCdPb3-1568858545908)(images/1568797368778.png)]
在这里插入图片描述

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

[外链图片转存失败(img-FqLdPEga-1568858545908)(images/1568797472019.png)]
在这里插入图片描述

尝试关闭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.

在这里插入图片描述

实际上,该警告就是触发了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)]
在这里插入图片描述

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)]
在这里插入图片描述
[外链图片转存失败(img-1TEMKaRV-1568858545909)(images/1568799400842.png)]
在这里插入图片描述

@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)]
在这里插入图片描述

Zookeeper与Eureka区别

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iBaoxing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值