上一篇:一、初始搭建SpringCloud项目环境
一、什么是服务注册与发现组件
1、基本概念
服务消费者 | 调用服务的一方程序 |
服务生产者 | 提供服务的一方程序 |
服务发现 | 服务消费者用于找到服务生产者的一种机制 |
服务注册与发现组件 | 类似于DNS的机制,服务注册与发现组件记录了分布式系统中所有服务的信息,用户或服务之间可以通过服务注册与发现组件找到这些服务。(多称为注册中心) |
2、服务注册与发现组件基本原理
服务注册与发现组件有两种行为模式,一种是服务端模式,一种是客户端模式
其主要区别在于服务消费者是否保存服务生产者的服务信息
A、服务端模式
1.服务生产者启动后,向服务注册中心注册自身的服务信息,如服务名,服务ip,服务端口等,并通过一定机制(如发送心跳)与注册中心维持通信
2.服务消费者向注册中心发起访问申请
3.注册中心解析了申请,调用相应服务生产者的接口/服务
B、客户端模式
1.服务生产者启动后,向服务注册中心注册自身的服务信息,如服务名,服务ip,服务端口等,并通过一定机制(如发送心跳)与注册中心维持通信
2.服务消费者从服务注册中心获取想要的服务生产者信息,并缓存到本地
3.服务消费者根据获取到的服务生产者信息,直接访问调用服务生产者的接口/服务
3、服务端模式与客户端模式的比较
复杂度:
客户端模式中每个消费者需要周期性维护一个服务列表,但是直接调用服务去除了一个中间件
服务端模式中每个消费者不需要维护服务列表
可用性:
客户端模式中每个消费者与生产者之间直接关联调用,即便注册中心故障也可以正常工作
服务端模式中一旦注册中心故障,则系统所有服务都用不了,而且,由于所有访问都通过注册中心(中间件)进行,注册中心负载极高
4、为什么需要服务注册与发现组件?
主要是为了去除传统开发模式中对服务路径硬编码的弊端。传统开发模式中,服务与服务之间使用硬编码方式记录对方的调用路径,一旦对方路径更改,则会导致无法调用相应的服务。
服务注册与发现组件的关键特性与作用
为了满足分布式服务的可用性,一个服务注册与发现组件不应该仅仅包括服务目录一个作用,还应提供服务查询以及服务维护的功能,当注册于服务注册与发现中心的服务故障时(长时间无法通信),理应从服务目录中移除(客户端模式应通知客户端同步移除)
5、Eureka
Eureka是netflix用于服务注册和发现的框架,采用客户端模式,框架分设Eureka Server和Eureka Client两种角色,其中Eureka Server用于保存维护服务注册,Eureka Client则向指定Eureka Server注册服务
6、Eureka的工作原理
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服务已经注册到注册中心
三、总结
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