SpringCloud Alibaba的简单(feign,nacos,gateway)远程服务调用,注册中心,配置中心,API网关

SpringCloud Alibaba

1、springcloud的痛点

1、微服务过多,治理成本高,不利于维护系统

2、分布式系统开发的成本高(容错,分布式事务等)对团队挑战大

2、springcloudAlibaba的优势

1、服务拆分粒度更细,有利于资源重复利用,有利于提高开发效率

2、可以更精准的制定优化服务方案,提高系统的可维护性

3、微服务架构采用去中心化思想,服务之间采用Restful等轻量级通讯,比ESB更轻量

4、适于互联网时代,产品迭代周期更短

3、springcloud Alibaba的组件

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

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

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

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

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

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

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

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

4、SpringCloud Alibaba的nacos作为配置中心和注册中心

  • 在项目的公共pom.xml中加入配置管理,以及配置中心和注册中心

    <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2.2.3.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
    </dependencyManagement>
    
    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.2.3.RELEASE</version>
            </dependency>
    
           <!--&lt;!&ndash; nacos配置中心&ndash;&gt;-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>2.2.3.RELEASE</version>
            </dependency>
    
  • 配置数据源,spring应用名称,Cloud的注册中心和配置中心,Mybatis-plus的mapper的映射位置及数据表的主键自增设置,及Tomcat的端口设置(这个不同服务必须要设置为不同的,不然其他的服务应用启动不了)

    spring:
      application:
        name: mall-coupon
      datasource:
        username: root
        password: root
        url: jdbc:mysql://192.168.56.111:3306/gulimall_sms
        driver-class-name: com.mysql.cj.jdbc.Driver
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #Nacos服务注册中心地址
          config:
            server-addr: localhost:8848 #Nacos服务配置中心地址
    #        file-extension: yaml #指定yaml格式的配置,此处注意只有yaml和properties两种格式,需要注意
    
    
    mybatis-plus:
      mapper-locations: classpath*:/mapper/**/*.xml
      global-config:
        db-config:
          id-type: auto
    
    server:
      port: 8082
    
    
  • 使用注册中心的开发流程

    • 在服务中生成相关的数据
    /**
         * 创建一个优惠券,用来被会员调用
         * @return
         */
        @RequestMapping("/member/list")
        public R memberCoupon(){
            CouponEntity couponEntity = new CouponEntity();
            couponEntity.setCouponName("满99减10元!");
    
            return R.ok().put("coupons",Arrays.asList(couponEntity));
        }
    
    • 在每个服务的主方法类上加上注解@EnableDiscoveryClient,表示将本服务注册到注册中心

    • 创建一个远程调用接口,用来服务之间的互相调用

      package com.robin.mall.mallmember.feign;
      
      import com.robin.common.utils.R;
      import org.springframework.cloud.openfeign.FeignClient;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      //被调用的服务
      @FeignClient("mall-coupon")
      public interface CouponServer {
          //被调用服务的头部信息
          @RequestMapping("/mallcoupon/coupon/member/list")
          public R memberCoupon();
      
      }
      
    • 在另一个服务中调用上面服务的数据

      @RestController
      @RequestMapping("mallmember/member")
      public class MemberController {
          @Autowired
          private MemberService memberService;
      
          @Autowired
          CouponServer couponServer;
      
          @RequestMapping("/coupons")
          public R testMemberService(){
              MemberEntity memberEntity = new MemberEntity();
              memberEntity.setNickname("tigerafqfa晚饭是阿为vW是温柔是千万别把别人笨");
      
              R r = couponServer.memberCoupon();
      		//这个r.get("coupons")里面的必须是被调用服务的那个Key值
              return r.ok().put("member",memberEntity).put("couponsya",r.get("coupons"));
      
          }
      
  • 使用配置中心的开发流程

    • 在主配置中加入
    <!--&lt;!&ndash; nacos配置中心&ndash;&gt;-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
    
    • 创建一个bootstrap.properties文件:
    spring.application.name: mall-coupon
    cloud.nacos.config.server-addr:localhost:8848 
    
    • 在配置中心添加一个:当前服务名.properties的文件,并把要配置的内容放在相应的位置,发布就可以
    • 在服务的类上加上@RefreshScope
  • 特别注意的是是么时候用不同的配置文件,就绪要指定对应的命名空间,配置集,配置集ID,配置分组

    • 命名空间:配置隔离,一般要把命名空间的那个字符串配置在bootstrap下
      • public:
      • 开发
      • 测试
      • 生成
      • 各个服务的命名空间
    • 配置集:一组相关或者不相关的配置项的集合
    • 配置集ID:
    • 配置分组:同一个配置集ID下,可以设置不同的配置分组
  • 加载多个配置文件:将数据源,redis,mybatis-plus,nacos等其他的配置都放到nacos的配置中心,然后在bootstrap.properties中指定命名空间和group

    #bootstrap.properties
    spring.cloud.nacos.config.namespace=c0702ddb-131a-4664-a2da-ce05f37d7c90
    spring.cloud.nacos.config.group=dev
    
    
    spring.cloud.nacos.config.encode=utf-8
    spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
    spring.cloud.nacos.config.extension-configs[0].group=dev
    spring.cloud.nacos.config.extension-configs[0].refresh=true
    
    spring.cloud.nacos.config.extension-configs[1].data-id=mybatis-plus.yml
    spring.cloud.nacos.config.extension-configs[1].group=dev
    spring.cloud.nacos.config.extension-configs[1].refresh=true
    
    spring.cloud.nacos.config.extension-configs[2].data-id=nacos.yml
    spring.cloud.nacos.config.extension-configs[2].group=dev
    spring.cloud.nacos.config.extension-configs[2].refresh=true
    
    spring.cloud.nacos.config.extension-configs[3].data-id=ohther.yml
    spring.cloud.nacos.config.extension-configs[3].group=dev
    spring.cloud.nacos.config.extension-configs[3].refresh=true
    

按理说应该可以得到配置中心中的数据,但是没得到,不知道为什么?

6、Gateway网关

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

特征

Spring Cloud Gateway功能:

  • 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上

  • 能够匹配任何请求属性上的路由。

  • 谓词和过滤器特定于路由。

  • Hystrix断路器集成。

  • Spring Cloud DiscoveryClient集成

  • 易于编写的谓词和过滤器

  • 请求速率限制

  • 路径改写

  • route:网关的基本构建块。它由ID,目标URI,谓词集合和过滤器集合定义。如果聚合谓词为true,则匹配路由。

  • predicate:这是Java 8函数谓词。输入类型是Spring FrameworkServerWebExchange。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。

  • Filter:这些是使用特定工厂构造的Spring FrameworkGatewayFilter实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。

开发流程:

  • 在导入springcloud的gateway的jar包

  • 将这个API网关注册到注册中心,以便能发现有哪些服务,将客户端发过来的请求路由到相应的服务地址上

  • 在配置文件中加入相应的rotes,predicates,filter(也可以加入到nacos的配置中心)

    spring:
      cloud:
        gateway:
          routes:
            - id: test_rotes
              uri: https://www.weibo.com
              predicates:
                - Query=url,weibo
    
            - id: test2_rotes
              uri: https://www.qq.com
              predicates:
                - Query=url,qq
    
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页