springcloud-alibaba 应用demo,基于https://github.com/rstyro/SpringCloud-Alibaba-learning的例子,将spring-cloud-alibaba升级到2021.1版本,并调试成功。
采用docker 的nacos镜像运行nacos服务, 重点调试了springcloud-nacos-discovery-provider、springcloud-nacos-discovery-consumer、springcloud-shiro和springcloud-nacos-sentinel项目。
一、升级spring-cloud-alibaba升级到2021.1版本
修改pom.xml
<parent>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>2021.1</version>
</parent>
二、调试springcloud-nacos-discovery-provider项目
首先要先注册服务,向nacos注册服务的名称就是spring.application.name的配置的名称,pom.xml文件注释掉不需要的spring-cloud-starter-zipkin依赖,修改application.xml,重点是nacos的server-addr地址。
spring:
profiles:
active: dev
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
调试时,项目依赖springcloud-shiro的权限控制,可以在application.xml中设置不启用shiro。
shiro:
enabled: false
annotations:
enabled: false
代码中注释掉权限的注解 @RequiresPermissions("user:list")
测试链接是http://localhost:8810/test/sayHi?name=test,测试成功
如果启用shiro,上述配置false 改为true,测试链接是 http://localhost:8810/test/sayHi?authority=rstyro&name=test。注意authority参数,可选值是rstyro、admin。
三、调试springcloud-nacos-discovery-consumer项目
采用springcloud loadbalancer的负载均衡,因此需禁用ribbon。pom.xml文件修改点如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--这里使用了 feign 要排除 ribbon 不然报错-->
<exclusions>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 增加 spring-cloud loadbalancer 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>${spring-cloud-loadbalancer.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>${spring-cloud-loadbalancer.version}</version>
</dependency>
application.yml文件配置如下,重点是配置nacos地址和loadbalancer的配置。
spring:
profiles:
active: dev
application:
name: nacos-consumer
cloud:
loadbalancer:
nacos: #ribbon
enabled: true
ribbon:
enabled: false #must set else then:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
enabled: true
sentinel:
enabled: true
transport:
port: 8719
dashboard: localhost:8858
#NamingService 配置属性
nacos:
server-addr: 127.0.0.1:8848
注意,1)一定要配置 loadbalancer.ribbon.enabled: false 和pom中exclusion ribbon,否则总是报错,找不到ribbon。
2)使用feign的web服务调用的FeignController,总是报错refuse connect。通过打印日志发现调用的provider发布的服务的地址不正确,即consumer项目没有从nacos正确获得provider的服务的服务ip。具体原因是nacos的服务发现的功能不正常,返回为空。最后重要找到nacos.server-addr的配置属性,NamingService需要此配置链接nacos服务器。估计这是配置文件没统一的缘故。其他相关属性如下:
{accessKey=${nacos.access-key:},
clusterName=${nacos.cluster-name:},
configLongPollTimeout=${nacos.configLongPollTimeout:}, configRetryTime=${nacos.configRetryTime:},
contextPath=${nacos.context-path:}, enableRemoteSyncConfig=${nacos.enableRemoteSyncConfig:},
encode=${nacos.encode:UTF-8},
endpoint=${nacos.endpoint:},
maxRetry=${nacos.maxRetry:},
namespace=${nacos.namespace:},
password=${nacos.password:},
secretKey=${nacos.secret-key:},
serverAddr=${nacos.server-addr:},
username=${nacos.username:}}
3、报错 No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
FeignController执行不成功。原因是spring-cloud-loadbalancer版本太高,应该是3.0.1.
<spring-cloud-loadbalancer.version>3.0.1</spring-cloud-loadbalancer.version>
四、典型配置参数说明
application.yml
#application.yml配置文件
spring:
profiles:
# 对应环境
active: dev
application:
# 服务名
name: pearl-test
cloud:
nacos:
config:
# 是否开启配置中心 默认true
enabled: true
# 配置中心地址
server-addr: localhost:8848
# 当要上阿里云时,阿里云上面的一个云账号名
access-key: accessKey
# 当要上阿里云时,阿里云上面的一个云账号密码
secret-key: secretKey
# Nacos Server 对外暴露的 context path
context-path: nacos
# 读取的配置内容对应的编码 默认UTF-8
encode: ISO-8859-1
# 配置文件后缀
file-extension: yml
# 配置对应的分组
group: PEARL_GROUP
# 命名空间 常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等
namespace: 771d3d1a-374b-47fe-b88b-c53a0b271acf
# 文件名前缀 默认为 ${spring.appliction.name}
prefix: prefix
# 客户端获取配置的超时时间(毫秒) 默认3000
timeout: 5000
# 配置成Nacos集群名称
#cluster-name: clusterName
# Nacos 认证用户
username: nacos
# Nacos 认证密码
password: 123456
# 长轮询的重试次数 默认3
max-retry: 5
# 长轮询任务重试时间,单位为毫秒
config-retry-time: 1000
# 长轮询的超时时间,单位为毫秒
config-long-poll-timeout: 1000
# 监听器首次添加时拉取远端配置 默认false
enable-remote-sync-config: true
# 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
#endpoint: localhost
# 是否开启监听和自动刷新
refresh-enabled: true
# 支持多个共享 Data Id 的配置,优先级小于extension-configs,自定义 Data Id 配置 属性是个集合,内部由 Config POJO 组成。Config 有 3 个属性,分别是 dataId, group 以及 refresh
shared-configs[0]:
data-id: pearl-common.yml
group: DEV_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
shared-configs[1]:
data-id: pearl-test.yml
group: DEV_GROUP
refresh: true
# 支持多个扩展 Data Id 的配置 ,优先级小于prefix+dev.yaml
# extension-configs:
feign config属性
feign:
client:
config:
defalut: # feign请求默认配置
connectTimeout: 2000
readTimeout: 3000
fiegnName: # fiegnName服务请求的配置,优先defalut配置。
connectTimeout: 5000 # 链接超时时间
readTimeout: 5000 # 请求
loggerLevel: full # 日志级别
errorDecoder: com.example.SimpleErrorDecoder #异常处理
retryer: com.example.SimpleRetryer # 重试策略
defaultQueryParameters: # 默认参数条件
query: queryValue
defaultRequestHeaders: # 默认默认header
header: headerValue
requestInterceptors: # 默认拦截器
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false #404响应 true-直接返回,false-抛出异常
encoder: com.example.SimpleEncoder #传输编码
decoder: com.example.SimpleDecoder #传输解码
contract: com.example.SimpleContract #传输协议