Spring Cloud
部分组件停止维护
环境搭建复杂
配置复杂
Spring Cloud Alibaba 技术搭配
Spring Cloud Alibaba - nacos: 注册中心
Spring Cloud Alibaba - nacos: 配制中心
Spring Cloud - Ribbon : 负载均衡
Spring Cloud - Feign : 调用远程服务
Spring Cloud Alibaba - Sentinel: 服务容错
Spring Cloud - GateWay : Api网关
Spring Cloud - Sleuth : 调用链监控
Spring Cloud Alibaba - Seata: 分布式事务解决方案
Nacos-注册中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
需要下载启动nacos server
common的application.yml中配置nacos服务器
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
添加注解
@EnableDiscoveryClient
据说不加注解也可以,因为Springboot的注解中有EnableAutoConfig
Feign 远程调用
1.引入open-feign
2.编写一个接口,告诉spring cloud这个接口要调用远程服务
1)声明接口中的哪一个方法都是调用哪一个远程服务的哪一个请求
3.开启远程调用
以coupon 和 member服务为例:
在coupon中创建membercoupon
在couponcontroler中写一个membercoupons功能,返回会员的优惠券。
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("coupons", Arrays.asList(couponEntity));
}
在member中调用coupon服务中的会员优惠券:
在membercontrol中编写一个调用函数:
@Autowired
CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R membercoupons = couponFeignService.membercoupons();
return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
}
并且需要声明一个接口
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R membercoupons();
}
告诉spring:
@EnableFeignClients(basePackages = "com.quinlan.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallMemberApplication.class, args);
}
}
尝试访问 localhost:7000/member/member/coupons
通过member服务调用coupons中的功能
Nacos作为配置中心:
1.导入依赖
2.创建bootstrap.properties文件,该配置文件会优先于“application.yml”加载。
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=192.168.137.14:8848
背景:
在“application.properties”配置文件,添加如下配置内容
coupon.user.name=”zhangsan”
coupon.user.age=30
修改“com.bigdata.gulimall.coupon.controller.CouponController”文件,添加如下内容
@Value(“${coupon.user.name}”)
private String name;
@Value(“${coupon.user.age}”)
private Integer age;
@RequestMapping(“/test”)
public R getConfigInfo(){
return R.ok().put(“name”,name).put(“age”,age);
}
启动“gulimall-coupon”服务:
这样做存在的一个问题,如果频繁的修改application.properties,在需要频繁重新打包部署。下面我们将采用Nacos的配置中心来解决这个问题。
nacos config
1、在Nacos注册中心中,点击“配置列表”,添加配置规则
DataID:gulimall-coupon.properties
配置格式:properties
2、修改“com.bigdata.gulimall.coupon.controller.CouponController”类,添加“@RefreshScope”注解
nacos 进阶
1、命名空间:用做配置隔离
默认:pulic(保留空间),可以创建多个空间:test、prop、dev
在bootstrap.properties中配置
spring.cloud.nacos.config.namespace=命名空间对应的uuid
每个微服务之间互相隔离配置,每个微服务创建自己的命名空间,只用自己命名空间的配置
- 配置集:所有配置集合
配置集id:dataid
配置分组:dataid所属的分组
可以在properties中指定配置分组:
spring.cloud.nacos.config.group=DEFAULT_GROUP
3.同时读取多个配置集
微服务任何配置信息,配置文件都可以放在配置中心中
只需要在bootsrap.properties中说明加载的配置中心哪些配置文件,springboot任何方法从配置文件中获取值,都能使用
api网关Gateway
路由:处理请求,确定目标的uri
断言:java8的predicate,处理http请求的headers、parameters,判断是否能成功。
过滤器:对请求和响应做出处理在发送前后
创建一个module: gulimall-gateway
依赖 gulimall-common
将gateway注册到注册中心,配置中心
application.yml中配置
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
bootstrap.properties中配置
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=484de7e2-80cf-4af1-847d-b965dd9c6e2a
主类中添加@EnableDiscoveryClient
添加路由规则,如:
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