目录
微服务-注册中心、配置中心、网关
简介
SpringCloud 的几大痛点
SpringCloud 部分组件停止维护和更新,给开发带来不便;
SpringCloud 部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
SpringCloud Alibaba 的优势:
阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低。
结合 SpringCloud Alibaba 我们最终的技术搭配方案:
SpringCloud Alibaba - Nacos :注册中心(服务发现/ 注册)
SpringCloud Alibaba - Nacos :配置中心(动态配置管理)
SpringCloud - Ribbon :负载均衡
SpringCloud - Feign :声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel :服务容错(限流、降级、熔断)
SpringCloud - Gateway :API 网关(webflux 编程模式)
SpringCloud - Sleuth :调用链监控
SpringCloud Alibaba - Seata原 :原 Fescar ,即分布式事务解决方案
版本选择
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且
spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟
SpringBoot 版本号一致的版本:
1.5.x 版本适用于 Spring Boot 1.5.x
2.0.x 版本适用于 Spring Boot 2.0.x
2.1.x 版本适用于 Spring Boot 2.1.x
项目中的依赖
在 common 项目中引入如下。进行统一管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Nacos [作为注册中心]
下载 nacos-server
后期装在linux上
https://github.com/alibaba/nacos/releases
启动 nacos-server
双击 bin 中的 startup.cmd 文件
访问 http://localhost:8848/nacos/
使用默认的 nacos/nacos 进行登录
将微服务注册到 nacos 中
在common模块中加入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置Nacos Server 地址
application.yml中配置Nacos Server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
@EnableDiscoveryClient 开启服务注册
使用@EnableDiscoveryClient 开启服务注册发现功能
Feign 声明式远程调用
简介
Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了 HTTP
请求的模板, 通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地
址等信息。
Feign 整合了 Ribbon (负载均衡)和 Hystrix( 服务熔断),可以让我们不再需要显式地使用这
两个组件。
SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我
们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了
SpringCloudRibbon 自行封装服务调用客户端的开发量。
使用
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开启 feign 功能
@EnableFeignClients(basePackages = "你的feign接口")
声明远程接口
@FeignClient("mall-coupon") //模块名字
mall-member 远程调用 all-coupon 模块接口
Nacos[ 作为配置中心]
态配置管理
引入依赖
在common中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
创建bootstrap.properties
会优先于application加载
spring.application.name=mall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在 nacos 中添加配置
名字和bootstrap.properties下的配置名字一样
动态获取和刷新配置
使用@Value 和@RefreshScope
成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment
的 PropertySources 中 。 这 里 我 们 使 用 @Value 注 解 来 将 对 应 的 配 置 注 入 到
SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能
命名空间
nacos创建命名空间
建立开发,测试,生产 三个环境的命名空间
配置列表获取命名空间id
在bootstrap配置文件假如明明空间id
这样就可以使用nacos下test环境的配置
每一个微服务都创建自己的微服务命名空间。只加载自己的配置
配置集
配置集 ID:
配置分组:同一个命名空间,不容组
使用配置分组区分环境
同时加载多个配置集
1微服务所有配置都可以放在配置中心中
2.在bootstrap配置中配置来源地址即可
Gateway
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。
特点
基于 Spring5,支持响应式编程和 SpringBoot2.0
支持使用任何请求属性进行路由匹配
特定于路由的断言和过滤器
集成 Hystrix 进行断路保护
集成服务发现功能
易于编写 Predicates 和 Filters
支持请求速率限制
支持路径重写
创建网关模块
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
加注解
启动类上加注解,
@EnableDiscoveryClient
配置nacos
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=mall-gateway
配置bootstrap
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=e94abfb8-7d8b-4c95-8c52-061fd10b7757
新建命名空间
编写网关配置文件
类似路由规则:
根据localhost:88/?url=baidu地址访问百度网站
spring:
cloud:
gateway:
routes:
- id: add_request_parameter-route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
问题:
版本问题:有可能使用
非正式版本的依赖 有可能对springcloud有冲突:
试着改成:2.2.1
现在是非正式版本,后面也要改成正式版本,不包含对任何SNAPSHOT版本的依赖,保证正式版本的稳定性
openfeign问题:
No Feign Client for loadBalancing defined.Did you forget to include spring-cloud-starter-loadbalance
原因:由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错
解决方法:
#添加loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
#排除ribbon
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
nacos配置中心检索不到bootstrap配置
假如以下依赖
<!--加载不了bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.1</version>
</dependency>
排除数据库检索
问题:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})