2.1 微服务的注册中心
注册中心相当于微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系,在分布式架构中,服务会注册到这里,当服务需要调用其他服务时,就在这里找到服务的地址进行调用。
2.1.1 注册中心的主要作用
服务注册中心是微服务架构中非常重要的一个组件,在微服务架构里主要起到了协调者的一个作用,注册中心一般包含如下几个功能:
(1)服务发现
- 服务注册/反注册:保存服务提供者和服务调用者的信息
- 服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
- 服务路由(可选):具有筛选整合服务提供者的能力。
(2)服务配置
- 配置订阅:服务提供者和服务调用者订阅微服务相关的配置
- 配置下发:主动将配置推送给服务提供者和服务调用者
(3)服务健康检测
- 检测服务提供者的健康情况
2.1.2 常见的注册中心
(1)Zookeeper
Zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,主要是用来解决分布式应用中经常用到的一些数据管理问题,如:统一服务命名、状态同步服务、集群管理、分布式应用配置项的管理等,即Zookeeper=文件系统+监听通知机制。
(2)Eureka
Eureka由Java语言开发,基于Restful API开发的服务注册与发现组件,Springcloud Netflix中的重要组件
(3)Consul
Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务注册和服务发布软件,采用Raft算法保证服务的一致性,且支持健康检查。
(4)Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单来说Nacos就是注册中心+配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册与发现,服务配置,服务管理等问题。Nacos还是Spring Cloud Alibaba组件之一,负责服务注册与发现。
上述注册中心的异同点:
组件名 | 语言 | CAP | 一致性算法 | 服务健康检查 | 对外暴露接口 |
Eureka | Java | AP | 无 | 可配支持 | Http |
Consul | go | CP | Raft | 支持 | Http/DNS |
Zookeeper | java | CP | Paxos | 支持 | 客户端 |
Nacos | java | AP | Raft | 支持 | Http |
CAP原理
强调 | 作用 | |
C | 一致性 | 保持多节点数据一致 |
A | 可用性 | 保持服务可用:多节点 |
P | 分区容错性 | 将数据存到多个节点 |
不可能同时满足CAP:
AC:放弃分区容错,物理数据库
AP:可以短暂允许数据不一致,NoSql数据库
CP:放弃可用性,zookeeper
2.2 Eureka概述
2.2.1 Eureka的基础知识
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。
上图简要描述了Eureka的基本架构,由3个角色组成:
1.Eureka Server
- 提供服务注册和发现
2.Service Provider
- 服务提供方
- 将自身服务注册到Eureka,从而使服务消费方能够找到
3.Service Consumer
- 服务消费方
- 从Eureka获取注册服务列表,从而能够消费服务
2.2.2 Eureka的交互流程与原理
2.3 使用Eureka
(1)搭建eureka server
- 创建工程模块(使用Initializr)
- 导入坐标
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<!--eureka-server 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<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>
- 配置application.yml
server:
port: 9000
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
register-with-eureka: false #是否将自己注册到注册中心
fetch-registry: false #是否从eureka中获取注册信息
- 配置启动类
@SpringBootApplication
//激活eureka server注册中心
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
(2)将服务提供者注册到eurekaServer上
搭建服务提供方
服务提供方的依赖:
- 引入坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置application.yml
server:
port: 8080
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
application:
name: service-provider #作为微服务的名称
mybatis:
type-aliases-package: com.pojo
#配置eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka
instance:
prefer-ip-address: true #使用ip注册
- 配置启动类
加上@EnableDiscoveryClient或@EnableEurekaClient注解
最新的SpringBoot可不配置注解
public class ServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderApplication.class, args);
}
}
(3)服务消费者通过注册中心获取服务列表并调用
由于服务消费方只需要使用Restful接口,因此只需要勾选Spring Web组件即可。
- 引入坐标
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 配置yml文件
server:
port: 8081
spring:
application:
name: service-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka
- 配置启动类
@EnableDiscoveryClient
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
(4)查看注册中心
访问 http://localhost:9000/