目录
前言
一.注册中心
二.CAP理论
三.常见的注册中心
四.Eureka
4.1搭建Eueka Server
4.2服务注册
4.3发现服务
4.4小结
学习专栏:http://t.csdnimg.cn/tntwg
前言
在SpringCloud里,我们可以发现一个巨大的问题,就是url是写死的,无法改变的,但是有什么法子修改吗?
啊?你问我为什么修改?你部署到服务器上的时候,url链接不要改吗?如果你换台机器,你的公网IP不会改变吗?
解决思路:有没有一种存在,服务方也就是被调用的服务主动的存储自身的链接,然后使用方只需要根据url的后半部分(@RequestMapping指定的路径)查找呢?
这个就是所谓的 注册中心
本次的配合的代码讲解还是部署当中的代码:http://t.csdnimg.cn/AYJSl
一.注册中心
注册中心:用于管理和维护服务实例信息的集中存储和查询系统。在微服务架构中,注册中心扮演着重要角色,主要功能包括服务注册、服务发现和服务状态监控。
注册中心有三种角色:
- 服务提供者(Server):⼀次业务中, 被其它微服务调⽤的服务. 也就是提供接⼝给其它微服务.
- 服务消费者(Client):⼀次业务中, 调⽤其它微服务的服务. 也就是调⽤其它微服务提供的接⼝.
- 服务注中心(Registry): 用于保存Server 的注册信息, 当Server 节点发生变更时, Registry 会同步变更. 服务与注册中心使⽤⼀定机制通信, 如果注册中⼼与某服务⻓时间⽆法通信, 就会注销该实例.
二.CAP理论
CAP理论分别为:一致性、可用性和分区容错性
一致性(Consistency):所有节点在同一时间的数据访问结果是一致的。换句话说,当一个数据更新操作完成后,所有后续的访问都应该返回最新的值。
可用性(Availability):系统在有限时间内能够返回一个非错误的响应,即服务一直可用,不管是正常的请求还是异常的请求。
分区容错性(Partition Tolerance):即使系统中出现网络分区(部分节点之间的通信失败),系统仍然能够继续工作。
-
一致性与可用性的冲突:在面临网络分区的情况下,要么选择保证数据的一致性,这可能会导致某些节点无法响应请求(降低可用性),要么保证可用性,这可能会导致节点间数据的不一致性(牺牲一致性)。例如,如果要求在所有节点间实时同步数据,而某些节点无法访问,那么要么阻塞请求以等待所有节点恢复,要么允许某些节点返回不完全一致的数据。
-
分区容错性的必要性:在分布式系统中,网络分区是难以避免的现象,特别是在大规模系统中。因此,分布式系统需要具备分区容错性,即使某些节点之间出现通信问题,整个系统仍能继续工作。这就增加了在网络分区下解决一致性与可用性之间的抉择难度。
三.常见的注册中心
常见的注册中心有三种:Zookeeper、Eureka 以及Nacos
Zookeeper
Apache Zookeeper 是一个分布式的开源协调服务,主要用于:
- 服务注册与发现:允许服务在集群中注册自己的地址,其他服务可以查询并发现注册的服务。
- 分布式锁:提供分布式锁的机制,用于协调分布式系统中的并发操作。
- 配置管理:可以作为配置中心,存储和管理分布式系统的配置信息。
Zookeeper 的优点包括稳定性和成熟度高,适合于那些对可用性要求不那么苛刻、但需要高一致性和稳定性的场景。
Eureka
Netflix 开发的 Eureka 是一个基于 REST 的服务注册与发现组件,特点包括:
- 服务注册中心:微服务通过将自己注册到 Eureka 服务器,使得其他微服务可以通过 Eureka 服务器来获取其位置信息。
- 客户端负载均衡:Eureka 客户端具备负载均衡能力,可以根据服务实例的健康状态进行负载均衡。
- 自我保护机制:当网络分区发生时,Eureka 能够保持对已知正常的服务实例的注册信息,并且不会立即从注册表中删除健康的实例。
Eureka 适合于云原生应用和基于 Netflix OSS 的微服务架构,但随着 Netflix 对 Eureka 的维护减少,一些新项目可能更倾向于选择其他解决方案。
Nacos
阿里巴巴开源的 Nacos 是一个更全面的动态服务发现、配置管理和服务管理平台,具有以下特点:
- 服务发现与注册:支持基于 DNS 和基于 RPC 的服务发现,适应各种场景下的服务注册与发现需求。
- 动态配置管理:支持动态配置的发布、监听和推送,可以实现动态配置更新。
- 服务及其元数据管理:提供服务的健康检查、路由及负载均衡策略的管理。
- 多环境支持:支持多环境(如开发、测试、生产环境)下的配置管理和服务发现。
Nacos 被认为是一个功能更加完善和未来性更强的替代品,尤其适合于需要高度动态性和灵活性的云原生应用场景。
一般而言Nacos最好,但是我们先讲解Eureka,为什么?因为本博主只学了后面两个!
四.Eureka
Eureka有一个注册中心,作用:
- 为微程序提供服务注册,发现,健康检测等能力!
服务提供者, 服务启动时, 会向Eureka Server 注册⾃⼰的信息(IP,端⼝,服务信息等),Eureka Server 会存储这些信息看不懂没关系,就是提交资源获取的路径,让别的服务器获取注册信息,进行获取需要的数据。
接下来的学习,我们将在-部署服务器的代码-基础上,搭建一个EurekaServer,将已经存在的Teacher-service和StudentService注册到Eureka上,StudentService远程调用时,从Eureka上获取StudentService的服务列表,进行交互!
4.1搭建Eueka Server
在我们的父项目里搭建一个子项目,eureka-service
引入eureka-server的依赖和构建插件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
编写在Java文件夹下创建一个包,再创建启动类
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class,args);
}
}
编写配置文件:application.yml
server:
port: 10010
spring:
application:
name: eureka-server
eureka:
instance:
hostname: localhost
client:
fetch-registry: false # 表⽰是否从Eureka Server获取注册信息,默认为true.因为这是
#⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false
register-with-eureka: false # 表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于
#当前应⽤就是Eureka Server,故⽽设置为false.
service-url:
# 设置与Eureka Server的地址,查询服务和注册服务都需要依赖这个地址.
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动服务: http://127.0.0.1:10010/
4.2服务注册
将Student-service和Teacher-service注册进去
第一步,引入依赖eureka-client
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
第二步,完善配置文件
两个配置文件都要完善!!!
server:
port: 8080 #另一个端口号不同
Spring:
application:
name: product-service #另一个名字不同
datasource: #数据库名不同
url: jdbc:mysql://127.0.0.1:3306/cloud_student?characterEncoding=utf8&useSSL=false
username: root
password: 密码
driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:
configuration: # 配置打印 MyBatis 执行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true #自动驼峰转换
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka
第三步,启动查看Eureka
4.3发现服务
指需要获取注册中心当中的url链接时的操作
第一步,在需要的服务项目当中,引入依赖
这个依赖就是服务注册和发现的依赖!
第二步,完善配置文件
和注册的完善是一致的!
第三步,远程调用
修改Server层的StudentService类
@Service
public class StudentService {
@Autowired
StudentMapper studentMapper;
@Autowired
RestTemplate restTemplate;
@Resource
private DiscoveryClient discoveryClient;
public StudentInfo getId(int id){
StudentInfo studentInfo = studentMapper.getId(id);
List<ServiceInstance> instances = discoveryClient.getInstances("Teacher-service");
EurekaServiceInstance instance = (EurekaServiceInstance) instances.get(0);
String url = instance.getUri().toString()+"/Teacher/"+studentInfo.getClassroom();
TeacherInfo teacherInfo = restTemplate.getForObject(url, TeacherInfo.class);
studentInfo.setTeacherInfo(teacherInfo);
return studentInfo;
}
}
4.4小结
- discoveryClient.getInstances("Teacher-service");当中的服务名称必须和注册的一模一样,有大小写区分
- 注册的服务的获取的服务需要的依赖是一样的
- 使用该类DiscoveryClient,获取服务,从而获取链接
注:学习负载均衡链接:http://t.csdnimg.cn/7dLx8