欢迎光临
我们一直在努力

SpringCloudAlibaba

1.介绍

什么是微服务?

微服务技术不等于spring cloud

微服务技术是将一个复杂的项目抽成一个一个小的项目(比如超市系统里面可以把用户管理和订单管理分开做成不一样的项目,然后他们之间通过http协议沟通)抽成小项目时之间的沟通和记录、排查、发版等问题需要解决,因此这才是完整的微服务技术

  •  当一个项目拆分成多个时,服务与服务之间如何调用?服务集群
  •  当项目过多不知道有什么项目?注册中心
  • 当每个项目都有相关的配置文件,而部分信息可以共用且多人修改配置方便管理?配置中心
  • 当用户访问某个项目判断是否有权限?服务网关
  •  当过多信息访问数据库时,速度过慢怎么办?分布所缓存(redis)+分布式搜索 (Elasticsearch)+mysql集群(mycat or starding jdbc)
  • 由于项目过多导致出现问题不知道怎么排查?分布式日志服务
  • 项目打包部署相关问题—CICD—-jenkins+docker+k8s
  • 当秒杀活动那些问题怎么解决?消息队列
  • 2.认识微服务

    2.1微服务演变

    单体架构

    单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署

    优点:

  • 架构简单
  • 部署成本低
  • 缺点:

  • 耦合度高
  • 分布式架构

    分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务

    优点:

    • 降低服务耦合
    • 有利于服务升级扩展

    服务治理

    分布式架构的问题:

    • 服务拆分粒度如何?
    • 服务集群地址如何维护?
    • 服务之间如何实现远程调用?
    • 服务健康状态如何感知?

    微服务

    微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:

    • 单一职责:微服务拆分粒度更小,每个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
    • 面向服务:微服务对外暴露业务接口
    • 自治:团队独立、技术独立、数据独立(独立的数据库)、部署独立
    • 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题

    微服务结构

    微服务结构需要技术框架来落地,经典:springcloudspringcloudalibabadubbo

    微服务技术对比

    2.2 springcloud

    2.3 服务拆分及远程调用

    服务拆分注意事项

  • 不同微服务,不要重复开发相同服务 比如查询订单以及对应的用户和商品,将逻辑全部嵌套到订单项目中,就导致了重复
  • 微服务数据独立,不要访问其它微服务的数据库
  • 微服务可以将自己的业务暴露为接口,供其它微服务调用
  • 1.微服务调用方式

    • 基于RestTemplate发起的http请求实现远程调用
    • http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可。

    提供者和消费者

    • 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
    • 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
    • 提供者与消费者角色其实是相对
    • 一个服务可以同时是服务提供者和服务消费者

    3.Nacos注册中心

    根据nacos安装指南进行安装使用即可

    nacos服务分级存储模型

    根据权重负载均衡

    实际部署中会出现这样的场景:

    服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求

    Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高

    1.实例的权重控制

    Nacos控制台可以设置实例的权重值,0~1之间

    ②同集群内的多个实例,权重越高被访问的频率越高

    ③权重设置为0则完全不会被访问

    环境隔离-namespace

    1.Nacos环境隔离

    ①每个namespace都有唯一id

    ②服务设置namespace时要写id而不是名称

    ③不同namespace下的服务互相不可见

    nacos注册中心细节分析

    定时拉取服务:列表会每隔30秒更新一次

    主动推送:当nacos发现部分提供者不可用时,会主动告诉给消费者

    1.Nacoseureka的共同点

    ①都支持服务注册和服务拉取

    ②都支持服务提供者心跳方式做健康检测

    2.NacosEureka的区别

    Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式

    ②临时实例心跳不正常会被剔除,非临时实例则不会被剔除

    Nacos支持服务列表变更的消息推送模式,服务列表更新更及时

    Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

    4. Nacos配置管理

    统一配置管理

    • 配置更改热更新

    在弹出表单中填写配置信息:

    boostrap.ymlapplication的优先级要高

    将配置交给Nacos管理的步骤

    ①在Nacos中添加配置文件

    ②在微服务中引入nacosconfig依赖

    ③在微服务中添加bootstrap.yml,配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个文件

    配置自动更新(热更新)

    Nacos配置更改后,微服务可以实现热更新,方式:

  • 通过@Value注解注入,结合@RefreshScope来刷新
  • 通过@ConfigurationProperties注入,自动刷新
  • 注意事项:

    • 不是所有的配置都适合放到配置中心,维护起来比较麻烦
    • 建议将一些关键参数,需要运行时调整的参数放到nacos配置中心,一般都是自定义配置

    多环境配置共享

    微服务会从nacos读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,环境配置
  • [服务名].yaml默认配置,多环境共享
  • 优先级:

  • [服务名]-[环境].yaml >[服务名].yaml > 本地配置
  • 以上是同一个nacos环境下可以分成不同服务环境配置设置方法

    多服务共享配置

    由于spring.application.name.yml这个文件是一定会被加载的,因此多环境共享配置可以写入这个文件

    微服务默认读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,默认配置
  • [服务名].yaml,多环境共享
  • 不同微服务共享的配置文件:

  • 通过shared-configs指定
  • 通过extension-configs指定
  • 优先级:

  • 环境配置 >服务名.yaml > extension-config > extension-configs > shared-configs > 本地配置
  • nacos集群搭建

    1. 修改application.properties文件,添加数据库配置

    spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?
    characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=
    true&useUnicode=true&useSSL=false&serverTimezone=UTC
    db.user.0=root
    db.password.0=123

    2. 复制多个nacos,设置端口为884588468847并启动nacos

    3. 修改nginx的配置文件为

    upstream nacos-cluster {
    server 127.0.0.1:8845;
    server 127.0.0.1:8846;
    server 127.0.0.1:8847;
    }
    server {
    listen 80;
    server_name localhost;
    location /nacos {
    proxy_pass http://nacos-cluster;
    }
    }

    而后在浏览器访问:http://localhost/nacos即可。

    4. 新增配置文件

    5.查看上面设置的数据库的表config_info

    http客户端feign

    自定义配置

    feign的性能优化

    Feign底层的客户端实现:

    • URLConnection:默认实现,不支持连接池,性能较差
    • Apache HttpClient :支持连接池
    • OKHttp:支持连接池 多人使用

    因此优化Feign的性能主要包括:

  • 使用连接池代替默认的URLConnection
  • 日志级别,最好用basicnone(默认)
  • feign的最佳实践

    一般不推荐

    1. 紧耦合

    2. 父接口参数列表映射不会被继承

    抽成一个独立的包

    统一网关Gateway

    搭建网关服务的步骤

    网关也是微服务之一,也是需要注册到nacos

    2.编写路由配置及nacos地址

    断言是布尔表达式,表达是否不是

    路由断言工厂Route Predicate Factory

    • 我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
    • 例如Path=/user/**是按照路径匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理
    • 像这样的断言工厂在SpringCloudGateway还有十几个

    官网上有详细说明

    路由过滤器 GatewayFilter

    GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

    全局过滤器 GlobalFilter

    全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。

    区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

    定义方式是实现GlobalFilter接口。

    过滤器执行顺序

    跨域问题处理

    跨域:域名不一致就是跨域,主要包括:

    l域名不同: www.taobao.com www.taobao.org www.jd.com miaosha.jd.com

    l域名相同,端口不同:localhost:8080localhost8081

    跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

    解决方案:CORS

    网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现:

    赞(0)
    未经允许不得转载:171主机测评 » SpringCloudAlibaba
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址