记录学习微服务与分布式架构,学习 alibaba系列组件
1.区分微服务和传统服务单机架构有哪些区别?
上图解释
传统单机: 耦合度过高,数据库压力大,当单点故障以后系统全盘崩溃
分布式架构:引入服务的概念,将模块拆分成一个个服务,原则上来说,每个服务单独单独享有一个属于自己的数据库,通过相互依赖和调用,组成统一的服务。
核心组件:
- 网关
- 服务的发现与注册
- 负载均衡器
- 熔断器(监控流量进行熔断或降级处理)
- 配置中心服务
- 链路追踪服务
综上,在如今数据爆炸,全民进入互联网的今天,分布式架构有哪些优势呢?
- 易开发 和维护
2.独立的部署和启动
但是我们也可以看到,这样的架构,有一个复杂的问题,就是要互相协同调用,对于治理需要付出精力。
作为一个服务如果我们想要调用别的服务,我们可以怎么做呢?
首先我们会想到用 Restemplate类来解决,提供uri地址进行通信,但是我们需要将url写死,对于数十个甚至上百个服务未免也太麻烦。因为 ip地址和端口是有可能改变的
Video video = restTemplate.getForObject("http://localhost:9000/api/v1/video/find_by_id?videoId="+videoId,Video.class);
所以我们引入了第一个组件,注册中心服务,负责发现和管理所有的服务。
2. nacos
一款alibaba 系的明星产品,可以负责发现和注册,相较于 其他产品,nacos 同时还提供动态配置的服务。
官网学习地址:https://nacos.io/zh-cn/
那么首先,什么是注册中心呢?
服务的注册:服务提供者provider,启动之后将自己的信息注册到注册中心,
服务的发现:对于其他服务而言,其他服务作为消费者,可以通过实时拉取注册中心上的服务名称来进行调用,避免上文说到的牵一发而动全身。
核心功能就是服务的管理,动态维护更新服务注册列表
admin / password: nacos / nacos
我们可以在服务列表里面发现我们注册启动的服务
使用步骤:
1. 添加依赖
<!--添加nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 配置 application.xml
spring:
application:
name: #服务名称 video-servcie
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3. 通过注解进行使用
在 XXXApplication类上写上 @EnableDiscoveryClient; 则可以nacos 发现并注册
// 这样通过服务名就可以直接从注册中心中拉取该名字的服务列表
List<ServiceInstance> list = discoveryClient.getInstances("video-service");
ServiceInstance serviceInstance = list.get(0);
Video video = videorestTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+
"/api/v1/video/find_by_id?videoId="+videoId,Video.class);