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-注册中心

  1. <dependency>
  2. <groupId>com.alibaba.cloud</groupId>
  3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  4. </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功能,返回会员的优惠券。

  1. @RequestMapping("/member/list")
  2. public R membercoupons(){
  3. CouponEntity couponEntity = new CouponEntity();
  4. couponEntity.setCouponName("满100减10");
  5. return R.ok().put("coupons", Arrays.asList(couponEntity));
  6. }

在member中调用coupon服务中的会员优惠券:

在membercontrol中编写一个调用函数:

  1. @Autowired
  2. CouponFeignService couponFeignService;
  3. @RequestMapping("/coupons")
  4. public R test(){
  5. MemberEntity memberEntity = new MemberEntity();
  6. memberEntity.setNickname("张三");
  7. R membercoupons = couponFeignService.membercoupons();
  8. return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
  9. }

并且需要声明一个接口

  1. @FeignClient("gulimall-coupon")
  2. public interface CouponFeignService {
  3. @RequestMapping("/coupon/coupon/member/list")
  4. public R membercoupons();
  5. }

告诉spring:

  1. @EnableFeignClients(basePackages = "com.quinlan.gulimall.member.feign")
  2. @EnableDiscoveryClient
  3. @SpringBootApplication
  4. public class GulimallMemberApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(GulimallMemberApplication.class, args);
  7. }
  8. }

尝试访问 localhost:7000/member/member/coupons
通过member服务调用coupons中的功能

Nacos作为配置中心:

1.导入依赖


com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config

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

每个微服务之间互相隔离配置,每个微服务创建自己的命名空间,只用自己命名空间的配置

  1. 配置集:所有配置集合
    配置集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