一、什么是SpringCloud Alibaba

1、简介

1)简介

阿里云未分布式应用开发提供了一站式解决方案。它包含了开发分布式应用程序所需的所有组件,使您可以轻松地使用springcloud开发应用程序。

有了阿里云,你只需要添加一些注解和少量的配置,就可以将spring云应用连接到阿里的分布式解决方案上,用阿里中间件搭建一个分布式应用系统。

2、环境搭建

新建一个空项目,然后按下述建模块(所有springcloud alibaba项目都要准备以下内容)

1)说明

springboot 2.2.x.RELEASE、springcloud alibaba 2.2.1、java 8+、maven 3.3.6+、idea 2020+

2)创建springboot模块,指定版本为2.2.5版本

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.2.5.RELEASE</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>

3)引入springcloud alibaba的版本管理

  1. <properties>
  2. <!--springcloud alibaba具体版本号-->
  3. <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
  4. </properties>
  5.  
  6. <!--全局引入springcloudalibaba下载依赖地址,并不会引入依赖-->
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>com.alibaba.cloud</groupId>
  11. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  12. <version>${spring-cloud-alibaba.version}</version>
  13. <type>pom</type>
  14. <scope>import</scope>
  15. </dependency>
  16. </dependencies>
  17. </dependencyManagement>

二、Nacos组件

1、基本介绍

1)什么是nacos?

  nacos:name configurations ,致力于帮助您发现、配置、和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos就是微服务架构中服务注册中心以及统一配置中心,用来替换原来的(eureka、consul)以及config组件。

2)安装Nacos(nacos server)

(1)下载nacos:

(2)解压缩安装包到指定位置

  bin:启动nacos服务的脚本目录

  conf:nacos的配置文件的目录

  target:nacos的启动依赖存放目录

  data:nacos的启动成功后保存数据的目录

(3)启动安装服务并访问

  1. #linux cd nacos/bin
  2. ./startup.sh -m standalone
  3. #windows cmd:执行下述命令或者双击startup.cmd
  4. startup.cmd -m standalone

http://10.7.36.84:8848/nacos/index.html

2、服务开发(nacos client开发)

1)创建项目并引入client依赖

  1. <!--引入nacos client依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>

2)配置注册地址(application.properties)

  1. #指定当前服务端口
  2. server.port=9000
  3. #指定服务名称
  4. spring.application.name=nacosclient
  5. #声明:指定nacos地址
  6. spring.cloud.nacos.server-addr=localhost:8848
  7. #指定注册中心地址
  8. spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
  9. #暴露所有web端口
  10. management.endpoints.web.exposure.include=*

3)开启启动服务注册注解(新版本之后可以省略)

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class NacosclientApplication {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(NacosclientApplication.class, args);
  7. }
  8. }

3、nacos配置中心

将nacos client的公共配置放入nacos配置中心进行管理。

1)开发步骤

(1)引入nacos config依赖(前提要引入nacos client依赖)

  1. <!--引入nacos配置依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  5. </dependency>

(2)在application.properties(需要改为bootstrap.properties)中配置配置中心地址

Data ID:的完成格式如:${prefix}-${spring.profile.active}.${file-extension}  如:configserver-dev.properties

  prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

  spring.profiles.acitve即当前环境对应的profile。当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变成${prefix}.${file-extension}。

  file-extension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。

  1. #远程配置中心的地址
  2. spring.cloud.nacos.server-addr=localhost:8848
  3. #读取配置的分组
  4. spring.cloud.nacos.config.group=DEFAULT_GROUP
  5. #指定读取文件后缀
  6. spring.cloud.nacos.config.file-extension=properties
  7. #指定配置文件方式一:
  8. #指定读取文件名称
  9. spring.cloud.nacos.config.name=configserver-dev
  10.  
  11. #指定配置文件方式二:
  12. #指定读取文件前缀
  13. #spring.application.name=configserver
  14. #指定读取文件的具体环境
  15. #spring.profiles.active=dev
  16.  
  17. #服务名称 应该放入nacos配置管理模块
  18. spring.application.name=configserver
  19. #指定向nacos server注册服务的名称
  20. spring.cloud.nacos.discovery.service=${spring.application.name}

(3)在nacos的配置管理模块的配置列表中创建配置

(4)在bootstrap.properties中增加以下配置,则可以在服务管理>服务列表对应的命名空间下查看对应服务

  1. #注册到指定namespace
  2. spring.cloud.nacos.discovery.namespace=0d621a49-3d3f-4f66-a3ed-6d2a4204d9f6
  3. spring.cloud.nacos.discovery.register-enabled=true

2)实现配置中心自动配置刷新

(1)自动刷新

默认情况下nacos已经实现了自动配置刷新功能,如果需要刷新配置直接在控制器中加入@RefreshScope注解即可。

  1. @RestController
  2. @RefreshScope
  3. public class ConfigController {
  4.  
  5. @Value("${username}")
  6. private String username;
  7.  
  8. @GetMapping("/config/getconfig")
  9. public String getConfig() {
  10. return username;
  11. }
  12. }

3)配置中心

(1)命名空间-namespace

用于进行用户粒度的配置隔离。不同的命名空间下,可以存在相同的Group或Data ID的配置。Namespace的常用场景之一是不同环境的配置文件隔离,例如开发测试环境和生产环境的之间(如配置、服务)隔离等。

在没有明确指定${spring.cloud.nacos.config.namespace}配置的情况,默认使用的是Nacos上Public这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:

  1. spring.cloud.nacos.config.namespace=b3********************

该配置必须放在bootstrap.properties文件中。此外spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在Nacos的控制台获取。并且在添加配置时注意不要选择其他的namespace,否则将会导致读取不到正确的配置。

(2)组-group

默认nacos中在管理配置文件时不显示制定group名称时默认的组名称为DEFAULT_GROUP。

(3)data-id

如上

三、服务间通信方式

见:微服务入门二:SpringCloud(版本Hoxton SR6) ->三、服务间通信方式

注意:

OpenFeign依赖不是alibaba的标准组件,所以引入OpenFeign依赖组件时要写版本号,或者在dependencyManagement同时加入【全局管理springboot版本】机制。

四、sentinel流量卫兵

1、什么是sentinel

1)概念

(1)说明

随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为突破口,在流量控制、断路、负载保护等多个领域进行工作,保障服务可靠性。

(2)特性

丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。

(3)sentinel提供了两个服务组件

一个是sentinel用来实现微服务系统中服务熔断、降级等功能。一个是sentinel dashboard用来监控微服务中流量调用等情况。

2)sentinel dashboard的安装

(1)下载

(2)启动

仪表盘是个jar包,可以通过java命令启动,如java -jar 方式运行,默认端口是8080

  1. java -Dserver.port=10000 -jar sentinel-dashboard-1.8.1.jar

2、sentinel实时监控服务

1)开发步骤

(1)引入依赖

先要引入nacos client依赖,然后再引入以下依赖:

  1. <!--引入sentinel依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  5. </dependency>

(2)编辑配置文件application.properties,新增以下有关sentinel配置:

  1. #开启sentinel 默认开启
  2. spring.cloud.sentinel.enabled=true
  3. #连接dashboard
  4. spring.cloud.sentinel.transport.dashboard=localhost:10000
  5. # 与dashboard通信的端口
  6. spring.cloud.sentinel.transport.port=8719

(3)访问

http://127.0.0.1:10000/,默认情况下sentinel为延迟加载,不会再启动之后立即创建服务监控,需要对服务进行调用时才会初始化。

(4)创建服务

  1. @RestController
  2. public class SentinelController {
  3.  
  4. @GetMapping("/sentinel/test")
  5. public String test() {
  6. return "sentinel测试服务";
  7. }
  8. }

3、流量控制

流量控制(flow control),其原理是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。同一个资源可以创建多条限流规则。FlowSlot会对该资源的所有限流规则依次遍历,直到有规则触发限流或所有规则遍历完毕。

一条限流规则主要由以下几个因素组成,我们可以组合这些元素来实现不同的限流效果:

  • resource:资源名,即限流规则的作用对象
  • count:限流阈值
  • grade:限流阈值类型(QPS或并发线程数)
  • limitApp:流控针对的调用来源,若为default则不区分调用来源
  • strategy:调用关系限流策略
  • controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)

流量控制主要由两种统计类型,一种是统计并发线程数,另外一种则是统计QPS。

1)阈值类型

  • QPS限流
  • 线程数限流

2)流控模式

  • 直接:标识流量控制规则到达阈值直接出发流量控制
  • 关联:当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写得速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过渡的争抢,举例来说,read_db和write_db这两个资源分别代表数据库读写,我们可以给read_db设置限流规则来达到写优先的目的:设置strategy为RuleConstant.STRATEGY_RELEATE同时设置refResource为write_db。这样当写库操作频繁时,读数据的请求会被限流。
  • 链路:

3)流控效果

  • 直接拒绝:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。
  • Warm up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过“冷启动”,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给系统一个预热的实际,避免冷系统被压垮。
  • 匀速排队:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。只能对请求进行排队等待。

4、熔断降级

todo

5、SentinelResource注解

todo

五、Nacos集群部署

  集群的安装建立在单机安装的基础上,且 Windows 机器和 Linux 机器并没有什么不同,甚至一部分 Nacos 部署在 Windows 上,一部分部署在 Linux 都可以 (需要保证服务器之前可以进行通信)。本节讨论的是如何部署一个生产可用的 Nacos 集群,并使用 MySQL 做数据持久化。

Nacos 集群部署架构图:

1、数据库准备(目前只支持MySQL)

生产使用建议至少主备模式,或者采用高可用数据库,用来存储Nacos的持久化数据。(本文为了演示就采用一个数据库),

初始化数据库:版本要求:5.6.5+,创建一个名为nacos_config 的数据库,运行conf/nacos-mysql.sql 脚本。创建一个名为nacos_config 的数据库,运行conf/nacos-mysql.sql 脚本。

  1. ### 配置网页端访问端口
  2. server.port=8848
  3.  
  4. ### 配置数据持久化的数据库,这里使用 mysql
  5. ### 如果需要启用数据库的话,需要导入 conf/nacos-mysql.sql 脚本
  6. ### 如果不启用数据库,则数据将持久化到本地 data/ 目录下
  7. ### If use MySQL as datasource:
  8. spring.datasource.platform=mysql
  9.  
  10. ### Count of DB:
  11. db.num=1
  12.  
  13. ### 数据库可以有多个,db.url.0=xxx db.url.1=xxx db.url.2=xxx
  14. ### 此处仅使用一个
  15. ### Connect URL of DB:
  16. 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
  17. db.user=username
  18. db.password=password

2、集群(cluster)配置

1)复制conf/cluster.conf.example并重命名为conf/cluster.conf,这是集群的配置文件,以后如果需要修改集群节点信息,也是编辑这个文件,比如增减节点等。

  1. # 单台机器部署集群
  2. # 需要在application.properties中修改对应的端口,默认的是8848
  3. # IP 相同,端口不同即可
  4. 127.0.0.1:8847
  5. 127.0.0.1:8848

2) 启动

配置完成后,如果单台机器模拟集群只需将 nacos-server 安装包,复制两份,然后各自执行命令启动。((standalone代表着单机模式运行,非集群模式,cluster为集群模式)

3)验证

两台台机器全部启动之后,随便访问一台机器上nacos即可。访问http://127.0.0.1:8848/nacos 访问 nacos。可以通过 集群管理 - 节点列表 来查看集群的情况。(节点元数据中naming.state 节点参数,指明了此节点为 Leader 节点,其他两个节点为 Follower。)如下图所示:

注意:以上同一网段下的配置

3、Nginx配置

打开 Nginx 的配置文件 conf/nginx.conf ,并在 http{} 节点下添加以下内容:

  1. upstream server_nacos{
  2. ip_hash;
  3. server 127.0.0.1:8848 weight=5;
  4. server 127.0.0.1:8847 weight=5;
  5. }
  6. server {
  7. listen 80;
  8. server_name localhost;
  9.  
  10. #charset koi8-r;
  11.  
  12. #access_log logs/host.access.log main;
  13.  
  14. location / {
  15. root html;
  16. proxy_pass http://server_nacos;
  17. proxy_set_header Host $host:$server_port;
  18. index index.html index.htm;
  19. }
  20. }

浏览器打开链接 http://localhost/nacos 访问 nacos。如果正常访问即通过验证。

参考:

1、spring Cloud Alibaba:Nacos 安装及使用

 

微服务入门三:SpringCloud Alibaba的更多相关文章

  1. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  2. .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

    前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...

  3. 微服务架构 | 2.2 Alibaba Nacos 的统一配置管理

    目录 前言 1. Nacos 配置中心基础知识 1.1 Nacos 在配置中心中的功能 1.2 Nacos 配置管理 Data ID 的构成 1.3 Nacos 配置的回滚机制 1.4 Nacos 配 ...

  4. 《Spring Cloud微服务 入门 实战与进阶》

    很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...

  5. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...

  6. 一、微服务概述与SpringCloud

    一.微服务概述与SpringCloud 1.微服务与微服务架构 微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面 ...

  7. .Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

    前言 上一篇[.Net Core微服务入门全纪录(三)--Consul-服务注册与发现(下)]已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来 ...

  8. .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

    前言 上一篇[.Net Core微服务入门全纪录(一)--项目搭建]讲到要做到服务的灵活伸缩,那么需要有一种机制来实现它,这个机制就是服务注册与发现.当然这也并不是必要的,如果你的服务实例很少,并且很 ...

  9. .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

    前言 上一篇[.Net Core微服务入门全纪录(四)--Ocelot-API网关(上)]已经完成了Ocelot网关的基本搭建,实现了服务入口的统一.当然,这只是API网关的一个最基本功能,它的进阶功 ...

随机推荐

  1. React之常用技术栈

     · react-redux:https://www.cnblogs.com/jingxuan-li/p/12439181.html  · react-router-dom:https://www.c ...

  2. 社交网络分析的 R 基础:(一)初探 R 语言

    写在前面 3 年的硕士生涯一转眼就过去了,和社交网络也打了很长时间交道.最近突然想给自己挖个坑,想给这 3 年写个总结,画上一个句号.回想当时学习 R 语言时也是非常戏剧性的,开始科研生活时到处发邮件 ...

  3. HowToDoInJava 其它教程 2 · 翻译完毕

    原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 JMS 教程 JMS 教 ...

  4. 通过json动态创建控制器

    通过字符串来创建控制器 如果通过字符串来创建控制器 不可以直接通过类型来获取对应的类 因为Swift有命名空间,类前需要加上命名空间的名称 获取命名空间的名称 let executable = NSB ...

  5. js修改css

    转载请注明来源:https://www.cnblogs.com/hookjc/ <style type="text/css"> .style{font-size:9pt ...

  6. 群聊(udp)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  7. action标签中method={1}怎么理解

    其实用到method={数字}的时候,相应的前面的action是要出现*通配符来搭配的.比如一个小例子:<action name="user_*" class="U ...

  8. 利用redis+AOP简单处理MQ冥等问题

    思路: 1.利用redis内部的串行执行特性,使用getandset()处理分布式问题; 2.注解提供入参选择,通过数据抽取后计算MD5值,实现业务性值的冥等: 代码区: 1.注解 1 /** 2 * ...

  9. 简单的JSON数组转树形结构

    function toTree(data) { let result = [] if(!Array.isArray(data)) { return result } data.forEach(item ...

  10. Redis 源码简洁剖析 11 - 主 IO 线程及 Redis 6.0 多 IO 线程

    Redis 到底是不是单线程的程序? 多 IO 线程的初始化 IO 线程运行函数 IOThreadMain 如何推迟客户端「读」操作? 如何推迟客户端「写」操作? 如何把待「读」客户端分配给 IO 线 ...