SpringCloud Alibaba (VS. SpringCloud)

springcloud对于支持以下功能所配备的组件

注册中心:Netflix--Eureka

配置中心:Config

API网关:Netflix--Zuul

断路保护:Hystrix

SpringCloud的几大痛点

  • 部分组件停止维护和更新,给开发带来不便;
  • 部分环境搭建复杂,没有完善的可视化界面,需要大量的二次开发和定制;
  • 配置复杂,难以上手,部分配置差别难以区分和合理应用。

SpringCloud Alibaba的优势:

性能强悍,设计合理,有成套的产品搭配,完善的可视化界面给开发运维带来极大的便利,搭建简单,方便易学。

SpringCloud Alibaba

致力于提供微服务开发的一站式解决方案,此项目包含开发分布式应用微服务的必须组件。依托SpringCloud Alibaba ,只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

结合SpringCloud Alibaba,最终的技术搭配方案为

SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)

SpringCloud Alibaba - Nacos:配置中心(动态配置管理)

SpringCloud - Ribbon:负载均衡

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

SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)—— springcloud里的Hystrix

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

SpringCloud - Sleuth:调用链监控

SpringCloud Alibaba - Seata:原Fescar,即分布式事务解决系统

如何引入依赖:

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

SpringCloud Alibaba - Nacos【作为注册中心】

Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。使用Java编写,依赖于java环境。

Nacos文档地址:Nacos 快速开始

 nacos下载地址:https://github.com/alibaba/nacos/releases

启动nacos-server: 

如果启动失败,参考:Nacos启动报错:Caused by: java.net.UnknownHostException: jmenv.tbsite.net-CSDN博客

  •  双击bin中的startup.cmd文件 (先进行下边的 【将微服务注册到nacos中】,再访问nacos)
  • 访问http://localhost:8848/nacos
  • 使用默认的 nacos/nacos 进行登录

将微服务注册到nacos中:

1. 首先修改pom.xml文件,引入Nacos Discovery Starter.

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

2. 在各个微服务的/src/main/resources/application.yml配置文件中配置 Nacos Server 地址

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.153.129:3306/gulimail_sms
    driver-class-name: com.mysql.cj.jdbc.Driver
# 配置 Nacos Server 的地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3. 使用 @EnableDiscoveryClient 开启各个服务主启动类的服务注册发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class GulimailCouponApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimailCouponApplication.class, args);
    }
}

4. 启动应用,观察nacos服务列表是否已经注册上服务

注意:每一个应用都应该有名字,这样才能注册上去。修改application.yml文件:

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.153.129:3306/gulimail_sms
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
# 给应用起名字
  application:
    name: gulimail-coupon

 刷新网页可以看到nacos服务列表已经注册上服务

5. 注册更多的服务上去,测试使用feign远程调用

nacos使用三步:

  • 导包 nacos-discovery 
  • 写配置application.yml, 指定nacos地址,指定应用的名字
  • 开启服务注册发现功能 @EnableDiscoveryClient

SpringCloud - OpenFeign【测试远程调用】

Feign是一个声明式的HTTP客户端,其目的就是让远程调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。

Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断),可以不再显式地需要这两个组件。

SpringCloud Feign在Netflix Feign的基础上扩展了对SpringMVC注解的支持,在其实现下,只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloud Ribbon自行封装服务调用客户端的开发量。

例如:会员member服务想要调用优惠券coupon服务:

在member服务中添加OpenFeign的依赖:

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

在优惠券coupon的controller中写获取优惠券的方法:

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

远程调用的步骤:

  • 引入open-feign;
  • 编写一个接口,告诉SpringCloud这个接口需要调用远程服务

     声明接口的每一个方法都是调用哪个远程服务的哪个请求:(在member服务中创建接口,注解声明调用的是coupon服务,将coupon服务中controller中的方法拿过来,其中路径是全路径)

@FeignClient("gulimail-coupon")
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}
  • 在调用者(member)的主启动类中开启远程调用功能:
@EnableFeignClients(basePackages = "com.wlp.gulimail.member.feign")

运行原理:当调用者(member)服务开启,将会自动扫描包下所有加了@FeignClient注解的接口,每个接口又说明了调用的是 “gulimail-coupon”这个服务的“/coupon/coupon/member/list”这个请求。

在MemberController.java中写测试方法:

    @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"));
    }

重启member和coupon两个服务。

如果重启member服务失败,并且报错:nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?   参考:OpenFeign报错:nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing d-CSDN博客

访问:http://localhost:8000/member/member/coupons   该路径为test方法的全路径名

即可看到优惠券的信息:

SpringCloud Alibaba - Nacos【作为配置中心】

如何使用nacos作为配置中心统一管理配置

1. 引入依赖:

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

2. 在服务中创建bootstrap.properties文件并配置(springboot规定:bootstrap.properties会优先于application.properties加载),该配置的前提是:启动nacos服务器

spring.application.name=gulimail-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

3. 需要给配置中心默认添加一个叫数据集(Data Id),默认的名字是:当前微服务名.properties

4. 给数据集添加任何配置(见上图)

5. 动态获取配置:

  • @RefreshScope:controller类的注解,作用是动态获取并刷新配置
  • @Value("${配置项的名}"):加载controller中,作用是获取到配置

以上所有配置完成后重启该服务,访问相应的路径,即可看到效果,之后再直接在nacos配置中心修改,不用再启动该微服务,直接刷新网页就可看到更改。

如果配置中心(nacos配置中心)和当前应用的配置文件中(application.properties)都配置了相同的项,优先使用nacos配置中心的配置。

如果在配置中心所做的更改无效,参考:nacos配置不生效-CSDN博客

Nacos作为配置中心:命名空间与配置分组

命名空间配置隔离

默认的保留空间是:public。【配置列表】中默认的所有新增配置都属于public保留空间。

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

在prod做一个相同的配置名字的gulimail-coupon.properties,启动coupon微服务,由于coupon微服务的配置文件bootstrap.properties中未进行其他的设置,则读到的是public中的配置。若想读到prod中gulimail-coupon.properties的配置,就要修改bootstrap.properties中的配置,其中namespace的属性值为prod空间的id。

spring.cloud.nacos.config.namespace=17988688-f7a4-48e6-98aa-86aa8330933c

 

 2. 每一个微服务之间互相隔离配置。每一个微服务都创建自己的命名空间,只加载自己命名空间下的配置,为各自微服务的bootstrap.properties修改namespace的id

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

配置集id:类似于配置文件名,即Data Id

配置分组:默认所有的配置集都属于DEFAULT_GROUP,在bootstrap.properties中可以设置分组名:

spring.cloud.nacos.config.group=coupon

每个微服务创建自己的命名空间,使用配置分组区分环境,dev   test   prod

Nacos配置中心-加载多配置集

将application.yml中的诸多配置进行拆分:让nacos配置中心管理诸多配置,例如:

 将application.yml中的配置拆分成三部分,分别如下图所示:

然后在bootstrap.properties中设置以上配置:

#coupon的命名空间的id
spring.cloud.nacos.config.namespace=539780bf-a850-41ee-80a8-1fdcff1cd09b
spring.cloud.nacos.config.group=coupon
#加载datasource.yml配置文件 中的dev分组,并动态刷新
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

#mybatis.yml配置文件 中的dev分组,并动态刷新
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

#other.yml配置文件 中的dev分组,并动态刷新
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true

加载多配置集总结:

1. 微服务任何配置信息,任何配置文件都可以放在配置中心中

2. 只需要在bootstrap.properties中说明加载配置中心哪些配置文件即可

3. 以前springboot任何方式从配置文件中获取值的注解都能使用,配置中心有的优先使用配置中心的:@Value,@ConfigurationProperties

微服务项目中只保留一个bootstrap.properties即可,application.yml 和 application.properties都不再需要。

SpringCloud - Gateway【网关】

网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloud gateway作为springcloud官方推出的第二代网关框架,取代了Zuul网关。

加入common依赖:

        <dependency>
            <groupId>com.wlp.gulimail</groupId>
            <artifactId>gulimail-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

1. 开启服务注册发现

@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})   //排除数据库配置

前提:启动nacos

application.properties中配置:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimail-gateway
#spring.main.web-application-type=reactive
server.port=88

创建getaway命名空间,并进行配置:

新建bootstrap.properties文件,并配置:

spring.application.name=gulimail-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1
# gateway的id号
spring.cloud.nacos.config.namespace=9d4b51ea-d5e5-41ce-ade2-68a3e2a48b06

然后启动主启动类。

配置网关:

新建application.yml

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.153.129:3306/gulimail_oms
    driver-class-name: com.mysql.cj.jdbc.Driver

  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
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto   #设置主键自增

访问:http://localhost:88/hello?url=qq (或baidu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值