谷粒商城分布式基础篇二

556 阅读10分钟

使用Spring Cloud Alibaba项目进行微服务开发

Spring Cloud Alibaba是什么?

          Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务

主要功能

服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。

分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。

阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。

阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

程序猿DD-翟永超-Spring Cloud Alibaba基础教程

为什么不使用Spring Cloud

       因为需要考虑Eureka 宣布闭源的问题。然而官方说的是 Eureka 2.0 的开源工作已经停止,依赖于开源库里面的 Eureka 2.x 分支构建的项目或者相关代码,风险自负!Spring Cloud 还是在 1.x 上面开发的,但有必要考虑到这一点所以可以使用Spring Cloud Alibaba

在这里插入图片描述

The existing open source work on eureka 2.0 is discontinued. The code base and artifacts that were released as part of the existing repository of work on the 2.x branch is considered use at your own risk. Eureka 1.x is a core part of Netflix's service discovery system and is still an active project.

使用 Nacos Discovery Starter 完成微服务应用的服务注册与发现

在这里插入图片描述

  1、在 公共项目dependencyManagement 中添加如下配置

<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>

  2、然后在 dependencies 中添加依赖,引入 Nacos Discovery Starter

    <!--        服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

  3、其次,修改各个服务的/src/main/resources/application.yml配置文件中配置 Nacos Server 地址

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

  4、然后在SpringBoot启动类添加@EnableDiscoveryClient 注解开启服务注册与发现功能   5、最后启动 Nacos Server,首先需要获取 Nacos Server,支持直接下载和源码构建两种方式。   直接下载:Nacos Server 下载页   源码构建:进入 Nacos Github 项目页面,将代码 git clone 到本地自行编译打包。   下载完后,运行启动 Server,进入解压后文件夹或编译打包好的文件夹,找到如下相对文件夹 nacos/bin,并对照操作系统实际情况之下如下命令。

Linux/Unix/Mac 操作系统,执行命令 sh startup.sh -m standalone
Windows 操作系统,执行命令 cmd startup.cmd

  6、Nacos Server 启动后,则可以启动项目,然后进入Nacos监控页面,则可以查看服务节点已经成功注册到 Nacos Server

http://127.0.0.1:8848/nacos 用户名和密码默认都为nacos

Nacos文档 几篇Nacos服务注册与发现文章: blog.csdn.net/liyanan21/a… blog.csdn.net/LO_YUN/arti… www.jianshu.com/p/61608ff86…

使用SpringCloud-OpenFeign远程调用服务

1.创建项目时引入依赖(谁需要调用服务则需要引入依赖)

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

2.编写一个接口,告诉SpringCloud这个接口需要调用远程服务

@FeignClient("指定需要调用服务名")
public interface TestFeignService {
    @RequestMapping("需要调用远程服务的controller方法全路径")
    //方法名和返回值,参数需要和远程调用方法一致
    public R testFeignMethod();
    
}

3.在项目启动类添加注解

@EnableFeignClients("这里写上面创建接口的全包名")

4.调用远程服务

@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private TestFeignService testFeignService;

    @RequestMapping("/test")
    public R test() {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("张三");

        R memberCoupons = testFeignService.testFeignMethod();
        return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
   		 }
    }

5.接下来就可以启动项目测试输入http://localhost:8000/member/member/test 成功页面

在这里插入图片描述
   调用过程:会先根据@EnableFeignClients注解指定的接口的全包名找到接口,然后通过@FeignClient注解指定的需要调用服务名找到服务(调用者和被调用者都需要注册到Nacos中),在根据方法名和指定的方法全路径找到远程服务方法进行调用。

使用 Nacos Config Starter 完成微服务应用的服务注册与发现

1、在公共项目pom.xml文件中添加依赖

 <!--        配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2、在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据

 spring.application.name=服务名
 spring.cloud.nacos.config.server-addr=127.0.0.1:8848

SpringBoot中有以下两种配置文件bootstrap (.yml 或者 .properties),application (.yml 或者 .properties)

1、加载顺序上的区别: 在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于applicaton。bootstrap主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。 2、应用场景:bootstrap.yml 和application.yml 都可以用来配置参数。 bootstrap配置文件可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。 application 配置文件可以用来定义应用级别的,主要用于 Spring Boot 项目的自动化配置。bootstrap 配置文件有以下几个应用场景:使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息,一些固定的不能被覆盖的属性,一些加密/解密的场景。

3、完成上述两步后,使用的 Nacos自带控制台发布配置

在这里插入图片描述
'

dataId和group在项目启动日志控制台中可以找到: 例:Loading nacos data, dataId:'gulimall-coupon.properties', group: 'DEFAULT_GROUP

修改group需要在配置文件中添加spring.cloud.nacos.config.group=MY_GROUP 注:该配置必须放在 bootstrap.properties 文件中

3、发布成功配置后启动应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加@RefreshScope 打开动态刷新功能

 @RefreshScope
 class SampleController {

 	@Value("${user.name}")
 	String userName;

 	@Value("${user.age}")
 	int age;
   
    @RequestMapping("/testNacosConfig")
    public R testNacosConfig(){
        return R.ok().put("userName",userName).put("age",age);
    }
 }

还可以在命令行中发布配置:

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=user.id=1%0Auser.name=james%0Auser.age=17"

4、启动项目打开自定义路径可以看到读取到之前配置的属性值

{
"msg": "success",
"code": 0,
"userName": "DAIHAO",
"age": 18
}

修改配置则只需要在Nacos Cofig中修改配置重新发布即可,@RefreshScope注解会动态刷新读取配置中心的配置

Nacos概念

1、命名空间:配置隔离;

  • 默认:public(保留空间);默认新增的所有配置都在public空间。
  • 1)、开发,测试,生产:利用命名空间来做环境隔离。 注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置 spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
  • 2)、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
    在这里插入图片描述

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

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

4、配置分组:默认所有的配置集都属于:DEFAULT_GROUP;     项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod

5、同时加载多个配置集

  • 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
  • 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
  • 3)、在这里插入图片描述以前SpringBoot任何方法从配置文件中获取值,都能使用。配置中心有的优先使用配置中心中的

将配置集拆分开

将配置集拆分开
将配置集拆分开
在这里插入图片描述
在bootstrap.properties配置文件中配置要读取的配置
在bootstrap.properties配置文件中配置要读取的配置
还有一些概念有可以官方文档查看Nacos文档