上一篇:一、初始搭建SpringCloud项目环境

一、什么是服务注册与发现组件

1、基本概念

服务消费者

调用服务的一方程序

服务生产者

提供服务的一方程序

服务发现

服务消费者用于找到服务生产者的一种机制

服务注册与发现组件

类似于DNS的机制,服务注册与发现组件记录了分布式系统中所有服务的信息,用户或服务之间可以通过服务注册与发现组件找到这些服务。(多称为注册中心)

2、服务注册与发现组件基本原理

服务注册与发现组件有两种行为模式,一种是服务端模式,一种是客户端模式
其主要区别在于服务消费者是否保存服务生产者的服务信息

A、服务端模式

服务发现和注册中心 服务注册与发现框架_服务发现和注册中心 服务注册与发现框架

1.服务生产者启动后,向服务注册中心注册自身的服务信息,如服务名,服务ip,服务端口等,并通过一定机制(如发送心跳)与注册中心维持通信

2.服务消费者向注册中心发起访问申请

3.注册中心解析了申请,调用相应服务生产者的接口/服务

B、客户端模式

服务发现和注册中心 服务注册与发现框架_服务端_02

1.服务生产者启动后,向服务注册中心注册自身的服务信息,如服务名,服务ip,服务端口等,并通过一定机制(如发送心跳)与注册中心维持通信

2.服务消费者从服务注册中心获取想要的服务生产者信息,并缓存到本地

3.服务消费者根据获取到的服务生产者信息,直接访问调用服务生产者的接口/服务

3、服务端模式与客户端模式的比较

复杂度:
客户端模式中每个消费者需要周期性维护一个服务列表,但是直接调用服务去除了一个中间件

服务端模式中每个消费者不需要维护服务列表

可用性:
客户端模式中每个消费者与生产者之间直接关联调用,即便注册中心故障也可以正常工作

服务端模式中一旦注册中心故障,则系统所有服务都用不了,而且,由于所有访问都通过注册中心(中间件)进行,注册中心负载极高

4、为什么需要服务注册与发现组件?

主要是为了去除传统开发模式中对服务路径硬编码的弊端。传统开发模式中,服务与服务之间使用硬编码方式记录对方的调用路径,一旦对方路径更改,则会导致无法调用相应的服务。

服务注册与发现组件的关键特性与作用
为了满足分布式服务的可用性,一个服务注册与发现组件不应该仅仅包括服务目录一个作用,还应提供服务查询以及服务维护的功能,当注册于服务注册与发现中心的服务故障时(长时间无法通信),理应从服务目录中移除(客户端模式应通知客户端同步移除)

5、Eureka

Eureka是netflix用于服务注册和发现的框架,采用客户端模式,框架分设Eureka Server和Eureka Client两种角色,其中Eureka Server用于保存维护服务注册,Eureka Client则向指定Eureka Server注册服务

6、Eureka的工作原理

服务发现和注册中心 服务注册与发现框架_客户端_03

1.客户端启动后,向服务注册中心注册自身的服务信息,如服务名,服务ip,服务端口等,并通过定期发送心跳(默认30s)与注册中心维持通信

2.客户端从服务注册中心获取想要的客户端服务生产者信息,并缓存到本地,当注册中心长时间无法与某个客户端通信,则从服务目录中移除

3.客户端根据获取到的客户端服务生产者信息,直接访问调用服务生产者的接口/服务

二、实践整合Spring Cloud Eureka

1、 第一步:在上一篇文章的父工程下创建注册中心服务端工程:springcloud-eureka,并引入依赖包

引入spring-cloud-starter-netflix-eureka-server

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

完整的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>com.springcloud</artifactId>
        <groupId>com.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cloud</groupId>
    <artifactId>com.cloud.eureka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!--注册中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、第二步:在resource目录创建bootstrap.yml文件(SpringBoot中bootstrap.yml比application.yml文件优先级更高),配置如下:

server:
  port: 8761 #暴露服务端口
spring:
  application:
    name: springcloud-eureka #服务id
eureka:
  client:
    # 是否要注册到其他Eureka Server实例
    register-with-eureka: false
    # 是否要从其他Eureka Server实例获取数据
    fetch-registry: false
    service-url:
      defaultZone: http://192.168.1.130:8761/eureka/ #供Eureka客户端使用的注册路径
  server:
    eviction-interval-timer-in-ms: 4000 # eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
    enable-self-preservation: false # 自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除,默认为true
    renewal-percent-threshold: 0.9 # Eureka Server 自我保护系数,当enable-self-preservation=true时,起作用

3、第三步:创建spring boot启动类SpringCloudEurekaApplication,添加服务发现注解@EnableEurekaServer,表明当前工程是eureka服务端

package com.mall.app;

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

/**
 * @类名 SpringCloudEurekaApplication
 * @描述 TODO
 * @版本 1.0
 * @创建人 XuKang
 * @创建时间 2021/6/10 15:02
 **/
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
}

4、第四步:创建Eureka客户端工程:springcloud-client,也就是我们平常的业务功能工程

引入依赖包:spring-cloud-starter-netflix-eureka-client

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

完整的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>com.springcloud</artifactId>
        <groupId>com.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cloud</groupId>
    <artifactId>ecom.cloud.client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--eureka 客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--作为web项目存在-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <!-- 添加spring-boot的maven插件,不能少,打jar包时得用 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5、第五步:在客户端的resource目录下创建bootstrap.yml文件,配置eureka注册信息

server:
  port: 7900 #服务端口
spring:
  profiles:
    active: dev #当前生效环境
  application:
    name: springcloud-client #指定应用的唯一标识/服务名

# 注册中心配置
eureka:
  instance:
    prefer-ip-address: true #优先使用IP地址注册
  client:
    service-url:
      defaultZone: http://192.168.1.130:8761/eureka/ #eureka的注册地址

6、第六步:创建客户端启动类SpringCloudClientApplication,使用@EnableEurekaClient注解表明当前模块是Eureka客户端

package com.mall.client;

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

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

第七步:访问Eureka服务注册管理页面,http://localhost:8761,可以看到springcloud-client服务已经注册到注册中心

服务发现和注册中心 服务注册与发现框架_服务端_04

三、总结

1、服务注册与发现组件 记录了分布式系统中所有服务的信息,用户或服务之间可以通过服务注册与发现组件找到这些服务。(多称为注册中心)

2、服务注册与发现组件有两种行为模式,一种是服务端模式,客户端之间交互经过服务端调度;一种是客户端模式,客户端之间直接交互

3、Eureka是netflix用于服务注册和发现的框架,采用客户端模式,框架分设Eureka Server和Eureka Client两种角色,其中Eureka Server用于保存维护服务注册,Eureka Client则向指定Eureka Server注册服务

4、Eureka服务端工程引入spring-cloud-starter-netflix-eureka-server依赖包,结合使用服务发现注解@EnableEurekaServer,表明自身是服务端,并提供注册路径供客户端注册

5、Eureka客户端工程(业务工程)引入spring-cloud-starter-netflix-eureka-client依赖包,结合使用@EnableEurekaClient注解,表明自身是客户端,在配置文件配置Eureka注册路径向目标Eureka服务端注册

四、资源地址

参考资源地址

下一篇:三、整合分布式配置中心 Spring Cloud Config