day2 springcloud组件(nacos注册/配置中心 feign组件请求调用 gateway网关)
springcloud相关配置
官方文档https://github.com/alibaba/spring-cloud-alibaba
在公共模块common中的pom.xml中加入
<dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
dependencyManagement是作为依赖管理的配置 里面的dependency配置包没有引入 作用相当于为以后引入的com.alibaba.cloud包定义了版本号
一.nacos服务注册中心Nacos Discovery
官方https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-discovery-example/readme.md
1)pom.xml引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2)nacos安装及配置
https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.zip
https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz
将startup.cmd中的MODE="cluster"集群模式改为MODE="standalone"单机模式 启动startup.cmd
默认启动端口8848
在需要使用注册中心的模块中yml加入配置spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
启动类中加上注解@EnableDiscoveryClient即注册到了注册中心
nacos还有管理平台http://localhost:8848/nacos
默认账号密码nacos/nacos
此时服务列表为空 因为需为服务起名才能看见 yml加上spring.application.name=名称 就能看到了
二.Fengin远程调用其它服务组件
1)引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)配置过程
启动类加上去扫描feign包的注解
@EnableFeignClients(basePackages = "com.hb.gulimail.member.feign")
扫描包中新增个Feign接口 如
@FeignClient("coupon")
public interface FeignTest {
@RequestMapping("/coupon/coupon/list")
public R list();
}
@FeignClient("coupon")是配置需调用的服务名 同时会自动注入bean
@RequestMapping即调用coupon服务中对应的接口
三.nacos配置中心
1)引入nacos配置中心依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2)添加/src/main/resources/bootstrap.properties
spring.application.name=coupon spring.cloud.nacos.config.server-addr=127.0.0.1:8848 //bootstrap.properties优先级比spplication.properties高 //服务名为coupon对应的在nacos的配置文件是coupon.properties
可以在controller中加上@RefreshScope热加载
3)配置命名空间/组
nacos中有命名空间菜单选项 对配置文件配置管理中有group组的选项
建议配置命名空间/组最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)
即每个微服务都创建命名空间 每个空间中的配置文件都区分(dev/test/prop)环境
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00 # 更改配置分组 spring.cloud.nacos.config.group=DEFAULT_GROUP
#默认nacos中的配置文件名称是 服务名.properties 改为yaml后缀方式为
#指定文件类型
spring.cloud.nacos.config.file-extension=yaml
4)多配置集
项目的配置信息可能不会全放同一个配置文件中 nacos也考虑到这种情况
)bootstrap.properties中配置
//指定nacos中配置文件的位置 组 spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml spring.cloud.nacos.config.extension-configs[0].group=dev spring.cloud.nacos.config.extension-configs[0].refresh=true spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml spring.cloud.nacos.config.extension-configs[1].group=dev spring.cloud.nacos.config.extension-configs[1].refresh=true spring.cloud.nacos.config.extension-configs[2].data-id=other.yml spring.cloud.nacos.config.extension-configs[2].group=dev spring.cloud.nacos.config.extension-configs[2].refresh=true
四.Gateway网关
网关是请求流量的入口,常用功能包括路由转发,权限校验,限流控制等。springcloud gateway
取代了zuul
网关。
1)三大核心概念
Route: 发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置 Predicate断言: 就是java里的断言函数,匹配请求里的任何信息,包括请求头等。根据请求头路由哪个服务 Filter: 过滤器请求和响应都可以被修改。 //白话:断言就是根据请求中的信息判断得请求到 可能类似mvc的handlemapping
断言 过滤器参考
https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/#gateway-request-predicates-factories
https://cloud.spring.io/spring-cloud-gateway/2.2.x/reference/html/#gatewayfilter-factories
2)配置例子
spring: cloud: gateway: routes: - id: test_route uri: https://www.baidu.com predicates: - Query=url,baidu - id: qq_route uri: https://www.qq.com predicates: - Query=url,qq - id: product_route uri: lb://gulimall-product predicates: - Path=/api/product/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment} - id: third_party_route uri: lb://gulimall-third-party predicates: - Path=/api/thirdparty/** filters: - RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment} - id: member_route uri: lb://gulimall-member predicates: - Path=/api/member/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment} - id: ware_route uri: lb://gulimall-ware predicates: - Path=/api/ware/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment} - id: admin_route uri: lb://renren-fast predicates: - Path=/api/** filters: - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}