SpringCloud Alibaba 实战,来自尚硅谷电商项目理解

电商项目常见解决技术搭配方案:

SpringCloud Alibaba --nacos:注册中心

SpringCloud Alibaba --nacos:配置中心

SpringCloud --Ribbon:负载均衡

SpringCloud --OpenFeign:声明式Http客户端(调用远程服务)

SpringCloud Alibaba --Sentinel:服务容错(限流、降级、熔断)

SpringCloud --Gateway:API网关(webflux编程模式)

SpringCloud --Sleuth(调用链监控)

SpringCloud Alibaba --Seata:分布式事务解决方案

一、如何使用spring cloud alibaba

1.在公共服务中加入依赖

	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

作用:因为都会用到springcloud alibaba,所以将<dependencyManagement>放到公共服务中,统一管理版本

1.1使用nacos作为服务注册中心

Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html

Nacos 下载地址:Releases · alibaba/nacos · GitHub

第一步:在需要注册到nacos的服务pom文件中添加相应的nacos依赖

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>

作用:将我们的服务注册到注册中心中,同时也可以从注册中心中发现其他服务

第二步:将 Nacos 服务器地址配置添加到 /src/main/resources/application.properties 文件中,

给当前服务命名

 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
 spring.application.name=nacos-test

第三步:使用@EnableDiscoveryClient 注解开启服务注册和发现

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ProviderApplication {

 	public static void main(String[] args) {
 		SpringApplication.run(ProviderApplication.class, args);
 	}

 	@RestController
 	class EchoController {
 		@GetMapping(value = "/echo/{string}")
 		public String echo(@PathVariable String string) {
 				return string;
 		}
 	}
 }

启动 Nacos 服务器

下载 Nacos Server下载页面

将下载的文件解压,进入nacos/bin文件夹(),并根据操作系统的实际情况

  1. Linux/Unix/Mac , 执行 sh startup.sh -m standalone
  2. Windows , 执行 cmd startup.cmd

查询服务

http://127.0.0.1:8848/nacos

用户名和密码默认都是nacos

1.2 使用Openfeign进行远程调用

Feign是一个声明式的http客户端,发送的是http请求,使用很简单

如:member会员服务需要调用coupon优惠券服务的方法

1.在member服务和coupon服务的pom文件中引入feign依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.开启feign功能,在member服务上开启

/**
 * 1.想要远程调用别的服务
 *   a.引入open-feign依赖
 *   b.编写一个接口,告诉springcloud这个接口需要调用远程服务
 *      声明接口的每一个方法都是调用哪个远程服务的哪个请求
 *   c.开启远程调用功能
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallMemberApplication.class, args);
    }

}

3.在member服务中声明远程接口

@FeignClient("gulimall-coupon"):其中gulimall-coupon为nacos注册的被调用的服务名,@RequestMapping("/coupon/coupon/member/list")路径为gulimall-coupon服务中membercoupons()方法的调用全路径(添加上controller上的请求路径)

@FeignClient("gulimall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();

}

对应的在gulimall-coupon服务中有membercoupons()方法的具体实现

@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

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

意思就是:在member服务中调用coupon服务的membercoupons()方法,会去nacos找注册的gulimall-coupon服务,得到它的注册地址和端口,加上"/coupon/coupon/member/list"路径去请求gulimall-coupon服务的membercoupons()方法。

1.3使用nacos作为配置中心

第一步:引入 Nacos Config 进行配置管理

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

第二步:在需要管理配置的服务下,添加bootstrap.properties

 在运行NacosConfigApplication 之前, 必须使用 bootstrap.properties 配置文件来配置 Nacos Server 地址(bootstrap.properties会优先于application.yml或application.properties启动 )

# DataId 默认使用 `spring.application.name` 配置跟文件扩展名结合(配置格式默认使用 properties), GROUP 不配置默认使用 DEFAULT_GROUP。因此该配置文件对应的 Nacos Config 配置的 DataId 为 nacos-config.properties, GROUP 为 DEFAULT_GROUP
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

注意:当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。

第三步:需要给配置中心添加数据集(Data Id)gulimall-coupon.properties

注意:Nacos Config 在加载配置的时候,不仅仅加载了以 DataId 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了DataId为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。

第四步:给 应用名.properties 添加任何配置

第五步:在需要读取配置的类上添加注解@RefreshScope,实时刷新获取配置文件内容

        @RefreshScope:动态获取并刷新配置

        @Value("${配置项的名}")

注意:如果配置中心和当前应用中都配置了相同的项,那么优先使用配置中心中的配置

细节部分:

1.命名空间:主要用来做配置隔离

默认是public(保留空间);默认新增的所有配置都在public空间

a:开发、测试、生产:利用命名空间来做环境隔离

注意:在bootstrap.properties中配置上需要使用哪个命名空间下的配置

spring.cloud.nacos.config.namespace=d71c6121-a583-45c9-979b-a0fc6eb87a89

 b:每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

2.配置集

        一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配
置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级
别等配置项。

3.配置集ID

        Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组
织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有
意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名
规则保证全局唯一性。此命名规则非强制。

4.配置组 

        Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或
Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个
配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置
分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和
MQ_topic 配置。
加载多配置文件:

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=31098de9-fa28-41c9-b0bd-c754ce319ed4
spring.cloud.nacos.config.ext-config[0].data-id=gulimall-datasource.yml
spring.cloud.nacos.config.ext-config[0].refresh=false
spring.cloud.nacos.config.ext-config[0].group=dev

1.4 SpringCloud Alibaba-Sentinel

官方文档:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
项目地址:https://github.com/alibaba/Sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,
从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。

Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例
如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,
避免影响到其它的资源而导致级联故障。

熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。
Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔
离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成
本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。 

Sentinel 对这个问题采取了两种手段

a.通过并发线程数进行限制

b.通过响应时间对资源进行降级

步骤:

1、引入依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、使用 Nacos 注册中心

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3、定义 fallback 实现

在服务消费者中,实现 feign 远程接口,接口的实现方法即为调用错误的容错方法
public class OrderFeignServiceFallBack implements OrderFeignService {
@Override
public Resp<OrderVo> getOrderInfo(String orderSn) {
return null;
}
}

4、定义 fallbackfactory 并放在容器中

@Component
public class OrderFeignFallbackFactory implements
FallbackFactory<OrderFeignServiceFallBack> {
@Override
public OrderFeignServiceFallBack create(Throwable throwable) {
return new OrderFeignServiceFallBack(throwable);
}
}

5、改造 fallback 类接受异常并实现容错方法

public class OrderFeignServiceFallBack implements OrderFeignService {
private Throwable throwable;
public OrderFeignServiceFallBack(Throwable throwable){
this.throwable = throwable;
}

@Override
public Resp<OrderVo> getOrderInfo(String orderSn) {
return Resp.fail(new OrderVo());
}
}

6、远程接口配置 feign 客户端容错

@FeignClient(value = "gulimall-oms",fallbackFactory =
OrderFeignFallbackFactory.class)
public interface OrderFeignService {
@GetMapping("/oms/order/bysn/{orderSn}")
public Resp<OrderVo> getOrderInfo(@PathVariable("orderSn") String
orderSn);
}

7、开启 sentinel 代理 feign 功能;在 application.properties 中配置

feign.sentinel.enabled=true

测试熔断效果。当远程服务出现问题,会自动调用回调方法返回默认数据。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值