微服务简介

1 什么是微服务

微服务是分布式架构的一种,是在设计分布式架构设计过程中,不断踩坑,然后,形成的一种经过良好架构设计的分布式架构方案。分布式架构就是把服务做拆分,在拆分的过程中会产生很多问题,而springcloud仅仅是解决了服务拆分时的治理问题。
微服务包含的技术栈

  • 微服务治理:注册发现、远程调用、负载均衡、配置管理、网关路由、熔断降级、分布式事务(Seata)等。
  • 缓存技术:redis持久化、缓存数据同步、Nginx本地缓存等。
  • 搜索技术:DSL语句、ES集群、竞价排名、集群脑裂、地理坐标等。
  • 异步通信技术:MQ消息模型、消息堆积问题、镜像集群、延迟队列等。
  • DevOps技术:Docker使用、DockerCompose、SkyWalkingJenkins等。

1.1 单体架构

  • 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单、部署简单。缺点:耦合度高。

1.2 分布式架构

  • 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。优点:降低服务耦合度、有利于服务升级拓展。缺点:服务拆分粒度如何、服务集群地址如何维护、服务之间如何实现远程调用、服务健康状态如何感知等问题。
    特征:
  • 单一职责,每个服务对应唯一的业务能力,避免重复开发
  • 面向服务:微服务对外暴露业务接口,服务间可以相互调用
  • 自治:团队独立、技术独立、数据独立、部署独立
  • 隔离性强:服务调用做好隔离、容错、降级,避免出现级联失败

1.3 服务拆分注意事项

  • 不同微服务,不要重复开发相同业务
  • 微服务数据库独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用

1.4 微服务远程调用

使用RestTemplate,Bean的注入只能写到配置类中,@SpringBootApplication本身也是配置类。RestTemplate是Spring-web中的类,前提有Spring。也可以手写get、post请求,用java的URL类。

@Bean
public RestTemplate restTemplate(){
	return new RestTemplate();
}
//第一个参数请求地址,第二个参数返回值类型的class
 restTemplate.getForObject();
 //第一个参数请求地址,第二个参数requestBody,第三个参数返回值类型的class
 restTemplate.postForObject();
  • 服务提供者:一次业务中,被其他微服务调用的业务。
  • 服务消费者:一次业务中,调用其他微服务的服务。
  • 服务消费者和提供者是相对的,既可以是消费者,也可以是服务者。

2 注册中心Eureka

  • 解决的问题:当服务的提供者有很多时的情况,服务多实例,服务集群的情况。就不能写死请求地址了。如果有过个服务提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?
  • Eureka-server注册中心负责记录和管理微服务。微服务在启动时,会将自己的信息注册给Eureka-service,例如ip、端口等,并且有心跳监控(每隔30s更新一次)。服务的消费者向Eureka拉取服务信息。
  • 负载均衡注解@LoadBalancedSpringCloud-common中的注解,轮循负载均衡、随机负载均衡
	@Bean
    @LoadBalanced //负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

3 Ribbon负载均衡

  • 规则接口是IRule,默认实现ZoneAvoidanceRule,根据zone(地区,上海或北京)选择服务列表,然后轮循。
  • 轮循机制:轮流调用
  • 随机机制:随机调用
  • 懒加载:默认懒加载,第一次访问时才会去创建LoadBalanceClient,请求时间很长。
  • 饥饿加载:会在项目启动时创建,降低第一次访问的耗时。开启姐加载指定微服务名称。

4 Nacos注册中心

  • 相对于Eureka更强大,不仅有Service registration and discovery(服务的注册和发现)功能,还有Distributed Configuration分布式配置等功能。

4.1 Nacos的使用

  • 第一步 父级工程中引入依赖
	<!-- SpringCloud 微服务 -->
    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
         <version>${spring-cloud.version}</version>
         <type>pom</type>
         <scope>import</scope>
     </dependency>

     <!-- SpringCloud Alibaba 微服务 nacos的管理依赖 -->
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>${spring-cloud-alibaba.version}</version>
         <type>pom</type>
         <scope>import</scope>
     </dependency>
  • 第二步 添加nacos的客户端依赖
<!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  • 第三部 修改yml配置文件
# Spring
spring: 
  application:
    # 应用名称
    name: test-demo
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: localhost:8848 #nacos服务地址

4.2 Nacos服务分级储存模型

  • 一级:是服务,例如:提供用户功能的user-service
  • 二级:是集群,以机房划分集群,例如:杭州集群、上海集群
  • 三级:是实例,例如:端口为8080的user-service微服务
    服务跨集群调用问题:尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其它集群

4.3Nacos服务集群属性配置

  • 修改yml配置文件
# Spring
spring:
  cloud:
    nacos:
      discovery:
        cluster-name: SH #配置集群名 机房位置:上海地区

4.4 Nacos根据集群负载均衡

当本地集群有问题时,访问其它地区访问。

test-demo:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #默认随机访问本地区集群

4.5 Nacos根据权重负载均衡

  • 实际部署中会出现这样的场景:服务器设备性能有差异,部分实例所在及其性能较好,另外一些老的机器性能较差,我们希望性能好的机器承担更多的业务量,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
    在这里插入图片描述
  • 权重值在0-1之间,只能是小数,权重设置为0时,则不会被访问!在服务升级时可以做到平滑升级!

4.6 Nacos环境隔离-namespace

  • Nacos中服务储存和数据储存的外层都是一个名为namespace的东西,用来做最外层隔离,依次是:namespace>group>Service/Data>cluster>instance
  • 每个namespace都有唯一id,不同namespace下的服务不可见,不能访问
  • 第一步 新建命名空间
    在这里插入图片描述
  • 第二步 yml配置文件
# Spring
spring:
  cloud:
    nacos:
      discovery:
        namespace: 12345678-1234-1234-5634681 #填写命名空间的id

4.7 Nacos设置临时实例和非临时实例

  • 临时实例:和Eureka一样采用心跳监测,隔一段时间向nacos注册中心发送一次信息,告诉nacos还在不在。
  • 非临时实例:由nacos注册中心主动询问服务提供者,是否还健康。
  • 通过yml文件配置
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: true # 默认为临时实例,系统上线后,可以设置为非临时实例
  • 服务消费者端:Eureka通过定时拉取服务pull,然后缓存服务列表,nacos则主动推送变更消息,来修改服务列表。

5 Nacos配置管理

  • 读取nacos的配置管理结合本地的配置结合使用。
  • 当nacos配置管理服务发生改变后,会主动通知微服务,配置修改了,并实现热部署,不用重启,自动生效。

5.1 实现配置管理

在这里插入图片描述

5.2微服务读取Nacos配置

  • 第一步 引入依赖
<!-- SpringCloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  • 第二步 新建bootstrap.yml文件,bootstrap.yml引导文件优先级高于application.yml
# Spring
spring:
  application:
    # 应用名称
    name: test-demo
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        # 配置文件格式
        file-extension: yml

5.3 配置热更新

  • 方式一:在@Value注解所在的类添加注解@RefreshScope

  • 方式二:在@ConfigurationProperties(prefix = "sd")自动实现刷新,不需要@RefreshScope

5.4 配置共享

  • 微服务启动时会从nacos读取多个配置文件,其中test.yaml文件一定会加载,因此可以将共享配置写入这个文件。
    在这里插入图片描述
  • 多种配置的优先级:nacos中的配置(服务名-rpofile.yml>服务名称.yml)>本地配置

6 Nacos集群搭建

  • 一、配置每个nacos集群ip
#it is ip
#example
192.168.16.101:8080
192.168.16.102:8081
192.168.16.103:8082
  • 二、配置数据库信息和端口号
server.port=8848
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=yuan159951.
  • 三、启动startup.cmd默认集群启动,startup.cmd -m standalone单机版。
  • 四、Nginx反向代理
upstream nacos-cluster{
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
	server 127.0.0.1:8082;
}
server {
		# 前台接口
        listen       80;
        server_name  localhost;

        location /nacos {
            proxy_pass http://nacos-cluster;
        }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逻辑峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值