Commit fa780b58 by 黄杰

Add SpringCloudAlibaba基础讲解.md

parents
# SpringCloud Alibaba
### 框架介绍
springcloud Alibaba是阿里巴巴对springcloud框架结合自家优秀的开源组件拼凑成的一套springcloud微服务框架。通过阿里提供的中间件来迅速搭建分布式应用系统。此框架只需要添加一些注解和少量配置就可以将SpringCloud接入阿里的微服务框架,并且在文档和社区生态方面比较广泛。
springcloud阿里开源组件
1.Nacos 是一个微服务注册中心和配置中心、同时提供了管理平台。
2.Dubbo 可将springcloud 服务之间的调用改为dubbo协议
3.Sentinel 中文名为哨兵 可通过流量控制、熔断降级、系统负载保护来确保服务的稳定。
### Nacos
SCAlibaba基于Nacos 实现了服务注册和配置管理功能,依靠 @EnableDiscoveryClient 进行服务注册,并兼容OpenFeign 好 RestTemplate 进行服务调用,它让我以极少的代码适配了SC的服务注册与发现标准,并默认集成了Ribbon的支持。
### Dubbo
SC默认的服务调用依赖 OpenFeign 或 RestTemplate 使用http协议进行调用
可使用spring-cloud-starter-dubbo starter可以将SC底层的http协议切换成Dubbo RPC协议 进行RPC调用。
参考文献 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/spring-cloud-alibaba-dubbo-examples/README_CN.md
### Sentinel
服务限流降级
Sentinel具有使用简单、稳定等特点,只需要在maven中映入starter 即可生效、并且还提供了控制台可实时款里降级限流规则。
## maven Nexus 私服使用
公司maven仓库统一为公司内部搭建的Nexus私服 地址为 http://maven.ihooyah.com:8899/
用户名:admin
密码:ihooyah
![img](https://img2018.cnblogs.com/blog/799093/201911/799093-20191119095126399-1714419836.jpg)
**这里看下type,现在来说下nexus四种仓库类型:**
- hosted :宿主仓库,这个仓库,是用来把公司内部的发布包部署到这个仓库里面来,然后公司内的其他人就可以从这个宿主仓库里去下载依赖使用
- proxy:代理仓库,这个仓库不是用来给公司内部的发布部署的,是代理了公司外部的各种仓库,例如java.net,codehaus,jboss等等,最重要就是它代理了公司外部的中央仓库,但是这里也可以修改nexus连接为阿里云镜像仓库,阿里云去连接中央仓库。
- 3rd party:该仓库是个宿主仓库,主要用来部署没法从公共仓库获取的第三方依赖包,比如说,你的公司依赖于第三方支付厂商的一个依赖包,那个依赖包不是开源的,是商业的包。那么你是没有办法从maven中央仓库获取的。此时,我们可能会自己手动从支付厂商那里获取到一个jar包,下载之后上传到私服里来,就放这个仓库里,3rd-party仓库
执行mvn clean deploy命令,就可以让maven自动给我们编译源代码、运行单元测试、打成jar包、将jar包安装到本地仓库、将Jar包部署到配置的远程私服仓库里面去
### 现阶段使用的SpringCloud注解
@EnableDiscoveryClient 将服务注册到nacos
@EnableCircuitBreaker SpringCloud中使用断路器
@EnableTransactionManagement service层事务
@EnableFeignClients openfeign客户端扫包
### Nacos注册中心使用
![img](https://upload-images.jianshu.io/upload_images/18465434-6e52eea204e1dd68.png?imageMogr2/auto-orient/strip|imageView2/2/w/804/format/webp)
nacos注册中心原理
![img](https://upload-images.jianshu.io/upload_images/18465434-d17f9ad8f6655a0a.png?imageMogr2/auto-orient/strip|imageView2/2/w/814/format/webp)
nacos配置中心原理
![img](https://upload-images.jianshu.io/upload_images/18465434-28cf0f9e370f5b64.png?imageMogr2/auto-orient/strip|imageView2/2/w/575/format/webp)
SpringCloud上Nacos的使用
1.maven导入
```xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
```
2.启动类加入@EnableDiscoveryClient注解开启向注册中心注册
3.yaml配置文件详情
```yaml
spring:
application:
name: common-server
cloud:
nacos:
config:
server-addr: localhost:8848 nacos服务地址
namespace: scbk 指定命名空间
file-extension: yaml 指定文件后缀
group: A1 指定分组
profiles:
active: dev 指定环境
```
nacos可使用命名空间进行环境隔离, 可以指定不同的环境,更好的管理开发、测试、生产的配置文件管理。
DataID 的格式:${spring.application.name}-${spring.profile.active}.${file-extension}
4.配置文件操作
配置文件格式支持一下几种TEXT、JSON、XML、YAML、HTML、Properties
资源文件每次修改都会记录一个历史版本,历史记录默认保存时间为30天,可以根据历史记录看到每次更新的内容。还可以让指定的记录文件回滚至上一个版本。
配置文件自动更新:使用spring的@RefreshScope注解可实现nacos中的配置自动推送更新
5.nacos集群部署
1.修改nacos启动文件中的 conf/cluster.conf 配置文件 将其它nacos的地址和端口写入,启动后可在集群管理中看到节点的信息,节点和节点之间会自动选举 第一个启动的节点会成为 leader
2.修改yaml配置文件
```yaml
cloud:
nacos:
config:
server-addr: localhost:8848,localhost:8847,localhost:8846
```
3.也可以通过nginx代理方式来代理集群的nacos
### OpenFeign服务之间的调用使用
1.OpenFeign提供了两个重要的注解 @FeignClient和@EnableFeignClients。
@FeignClient标注用于声明Feign客户端可访问的Web服务。
FeignClient默认的config类为 FeignClientsConfiguration ,我们也可以通过FeginClient注解上的 configuration 来自定义config类。
也可以通过yaml文件中的
fegin.okhttp.enabled= true & feign.httpclient.enabled = true 来设置使用okhttp还是apache的 HttpClient
2.OpenFeign故障转移
如果@FeignClient指定了fallback属性,http请求调用失败时会路由到fallback处理类的相同方法中
@EnableFeignClients标注用于修饰Spring Boot应用的入口类,以通知Spring Boot启动应用时,扫描应用中声明的Feign客户端可访问的Web服务。
### gateway网关
Spring Cloud Gateway 是 Spring Cloud 的一个网关组件,它的存在是为微服务架构提供一种简单有效的统一的 API 路由管理方式。 只需要在项目中引入就可以将项目变成一个网关
```xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
```
gateway网关特征
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
- 动态路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- 易于编写的 Predicates 和 Filters
- 限流
- 路径重写
- **Route(路由)**:这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- **Predicate(断言)**:这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
- **Filter(过滤器)**:这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
网关配置文件详解
cloud:
​ gateway:
​ routes:
\- id: common-server
​ uri: lb://common-server
​ order: 8000
​ predicates:
\- Path=/api/common/** //通过路径来转发
\- After=2020-01-01T00:00:00+08:00[Asia/Shanghai] //通过请求时间来转发
​ -Before=2019-01-01T00:00:00+08:00[Asia/Shanghai] //通过请求时间之后来转发
- Between=2019-01-01T00:00:00+08:00[Asia/Shanghai], 2019-07-01T00:00:00+08:00[Asia/Shanghai]
- \- Cookie=sessionId, test //通过cookie来转发
- \- Header=X-Request-Id, \d+ //通过请求头参数来匹配转发
- Host=**.baidu.com 通过host内容来转发
- \- Method=GET 通过请求方式来转发
- \- Query=smile 通过匹配参数来转发
- \- RemoteAddr=192.168.1.1/24 通过请求ip来进行转发
​ filters:
\- StripPrefix=2
也可以进行组合使用
### swagger-ui配置讲解
1.通过swagger-spring-boot-starter jar包来引入swagger-ui的文档功能
maven pom如下
```xml
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
</dependency>
```
2.yaml文件配置swagger
swagger:
​ enabled: true //测试环境开启生产环境关闭
​ base-package: com.ihooyah.common.server
​ title: common-server
​ version: 1.0.0.SNAPSHOT
​ description: 石城播客服务端
​ contact:
​ name: common-server
3.在应用主类中增加`@EnableSwagger2Doc`注解
#### **swagger常用注解:**
swagger2是通过扫描很多的注解来获取数据帮我们展示在ui界面上的,下面就介绍下常用的注解。
1、**@Api()**:用在请求的类上,表示对类的说明,也代表了这个类是swagger2的资源
参数:
```text
tags:说明该类的作用,参数是个数组,可以填多个。
value="该参数没什么意义,在UI界面上不显示,所以不用配置"
description = "用户基本信息操作"
```
2、**@ApiOperation()**:用于方法,表示一个http请求访问该方法的操作
参数:
```text
value="方法的用途和作用"
notes="方法的注意事项和备注"
tags:说明该方法的作用,参数是个数组,可以填多个。
格式:tags={"作用1","作用2"}
(在这里建议不使用这个参数,会使界面看上去有点乱,前两个常用)
```
3、**@ApiModel()**:用于响应实体类上,用于说明实体作用
参数:
```text
description="描述实体的作用"
```
4、**@ApiModelProperty**:用在属性上,描述实体类的属性
参数:
```text
value="用户名" 描述参数的意义
name="name" 参数的变量名
required=true 参数是否必选
```
5、**@ApiImplicitParams**:用在请求的方法上,包含多@ApiImplicitParam
6、**@ApiImplicitParam**:用于方法,表示单独的请求参数
参数:
```text
name="参数ming"
value="参数说明"
dataType="数据类型"
paramType="query" 表示参数放在哪里
· header 请求参数的获取:@RequestHeader
· query 请求参数的获取:@RequestParam
· path(用于restful接口) 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
defaultValue="参数的默认值"
required="true" 表示参数是否必须传
```
7、**@ApiParam()**:用于方法,参数,字段说明 表示对参数的要求和说明
参数:
```text
name="参数名称"
value="参数的简要说明"
defaultValue="参数默认值"
required="true" 表示属性是否必填,默认为false
```
8、**@ApiResponses**:用于请求的方法上,根据响应码表示不同响应
一个@ApiResponses包含多个@ApiResponse
9、**@ApiResponse**:用在请求的方法上,表示不同的响应
**参数**
```text
code="404" 表示响应码(int型),可自定义
message="状态码对应的响应信息"
```
10、**@ApiIgnore()**:用于类或者方法上,不被显示在页面上
11、**@Profile({"dev", "test"})**:用于配置类上,表示只对开发和测试环境有用
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment