spring cloud alibaba 入门学习
Nacos搭建
作用:服务注册、服务发现、配置中心
环境:window 10
方式一:【官方编译产物】
1.官网下载
https://nacos.io/download/nacos-server/
3.启动服务
- 官方
https://nacos.io/docs/latest/quickstart/quick-start/#4%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%99%A8
2.按文档配置数据库
https://nacos.io/docs/latest/manual/admin/deployment/deployment-standalone/
- 可设置bat 快速启动 ,指定bin目录及单机启动模式
@Title Nacos
start cmd /k "cd /d E:\nacos-server-2.4.2.1\nacos\bin && startup.cmd -m standalone"
方式二:【源码编译】下载、安装、配置
1.git下载地址
//码云上下载的更快一点
https://gitee.com/mirrors/Nacos?_from=gitee_search
2.根目录下打包安装(请在cmd下运行,Powershell各种问题)
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
成功了
3.进入 distribution/bin 启动
进入到此目录 /distribution/target/nacos-server-2.0.2/nacos/bin
在此目录下cmd打开命令窗口
windows系统下执行: cmd startup.cmd -m standalone(注意有坑,1.如果此命令无效,直接输入startup.cmd -m standalone,2,此命令为单机模式启动,如果直接双击文件启动可能会报错)
Lunix系统下执行: sh startup.sh -m standalone
4.启动完成,登录
启动完毕后:http://localhost:8848/nacos 可直接进去Nacos登录界面(账号密码皆为:nacos)
5. Naco动态配置(此部分建议跳过,配置中心我是在Sentinel调试后改动了配置文件及pom)
注意1:jar 引入
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意2:配置中新选择常用的Data ID 配置格式,有yaml 和properties。 特别注意java项目优先运行的文件是bootstrap.yml 或 bootstrap.yml, 用application.yml 我是怎么也获取不到动态配置的,于是直接将application.yml更名为bootstrap.yml完美解决
注意3:Data ID 命名要求严格,项目名-环境.后缀名 (环境没有区分可以省略,配置不对是个坑)
官方说明 https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
下图为sentinel完成调试后的图,已标记重点
Nacos 搭建完成,接下来需要服务提供者
服务提供者
1.创建父工程
- 新建文件夹spring-cloud-alibaba
- IDEA打开文件夹,文件夹下创建pom.xml,注意加入maven项目管理
一定要主要版本搭配,不然会报错。具体参考此链接,也有配置,依赖相关的文档:
https://github.com/alibaba/spring-cloud-alibaba#version-control-guidelines
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zpa.alibaba</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>alibaba-provider2</module>
<module>alibaba-provider1</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
2.创建服务提供者(即子module,这里我创建两个Provider1: 8700、Provider2: 8800,下main示例1)
1,在spring-cloud-alibaba文件下新建—>Module—>Maven—>创建项目alibaba-provider1
2,pom.xml中无需导入依赖。
3, 在java目录下新建项目包com.lhc.alibaba,在包目录下新建项目的启动类。
4, 在resources目录下新建application.yml配置文件
5,如配置文件不是小绿叶图标,File–>Project Structure–>Module–>,,,输入application搜索添加即可
6,在配置中导入配置文件内容
7,启动项目,然后在Nacos注册中心下服务列表下可查看是否已注册。
8.Nacos 查看服务注册
9.写测试方法用于消费者调试
创建消费者
1.父工程添加消费者 openfeign 依赖(创建父工程时应该已添加了)
2.在spring-cloud-alibaba文件下新建—>Module—>Maven—>创建项目alibaba-consumer1
3,java目录下创建Consumer1Application启动类,添加@EnableFeignClients注解
4.在resources目录下新建application.yml配置文件
5,创建service接口
6.,创建controller接口
7.访问http://localhost:8701/hello接口(访问正常,消费者常见完毕,此处可理解:生产者为消费者接口调用时的实现)
OpenFeign注意问题
1.所需依赖注入不进去的手动处理办法
异常如下
Caused by: feign.codec.DecodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:119)
at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:87)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138)
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89)
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1717)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1273)
at org.springframework.beans.factory.support.DefaultListableBeanFactory$DependencyObjectProvider.getObject(DefaultListableBeanFactory.java:1906)
at org.springframework.cloud.openfeign.support.SpringDecoder.decode(SpringDecoder.java:57)
at org.springframework.cloud.openfeign.support.ResponseEntityDecoder.decode(ResponseEntityDecoder.java:62)
at feign.optionals.OptionalDecoder.decode(OptionalDecoder.java:36)
at feign.AsyncResponseHandler.decode(AsyncResponseHandler.java:115)
... 33 more
处理方法:手动注入方式,可在启动类或配置中
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
2.调用超时问题处理
参考对应版本官方文档,如
https://docs.spring.io/spring-cloud-openfeign/docs/2.2.9.RELEASE/reference/html/#timeout-handling
Sentinel的简单使用
1.下载地址 https://github.com/alibaba/Sentinel ,这里我使用用IDEA Git拉取的
2.启动,通过IDEA 将maven 编译打包,到 Sentinel\sentinel-dashboard\target 下打开cmd
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
3.登录 地址 默认http://localhost:8080/ 账号密码均为 sentinel
4.父工程添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
5.消费者配置
限流自处理
服务降级自处理
需要限流、降级的服务接口
项目启动后在Sentinel中配置限流、熔断等规则
频繁刷新的效果
感谢参考文章:https://blog.youkuaiyun.com/EnlightenedNet/article/details/114634269
Spring Cloud GateWay
1.父工程依赖jar,注意GateWay中含有start-web 会与外层引入的冲突
2. 新建网关项目Module(略)
3.配置
server:
port: 8888 #项目端口
spring:
application:
name: cloud-gateway #项目名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #注册中心Nacos路径端口
config:
server-addr: localhost:8848
file-extension: yaml #指定yaml格式的配置,此处注意只有yaml和properties两种格式,需要注意
gateway:
routes: # 路由数组 指当请求满足什么样的条件的时候,转发到哪个微服务上
- id: nacosxfz_route #当前路由标识,要求唯一 (默认值uuid,一般不用,需要自定义)
uri: lb://alibaba-consumer1 #请求最终要被转发的地址
order: 1 #路由优先级,数字越小,优先级越高
predicates: #断言 判断条件,返回值是boolean 转发请求要返回的条件 (可以写多个)、
- Path=/consumer/** #当请求路径满足path指定的规则时,此路由信息才会正常转发
filters: #过滤器(在请求传递过程中,对请求做一些手脚)
- StripPrefix=1 # 在请求转发之前去掉一层路径
management:
endpoints:
web:
exposure:
include: "*" #健康状态监测