商城项目04_SpringCloud Alibaba概述Nacos作为注册配置中心声明式远程调用Feign

Posted 所得皆惊喜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商城项目04_SpringCloud Alibaba概述Nacos作为注册配置中心声明式远程调用Feign相关的知识,希望对你有一定的参考价值。

文章目录

①. SpringCloud Alibaba简介

  • ①. Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务。依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统

  • ②. 为什么使用

  • ③. SpringCloud的几大痛点

  1. SpringCloud部分组件停止维护和更新,给开发带来不便;
  2. SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
  3. SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用
  • ④. SpringCloud Alibaba的优势
    阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用 成套的产品搭配完善的可视化界面给开发运维带来极大的便利搭建简单,学习曲线低

  • ⑤. 结合 SpringCloud Alibaba我们最终的技术搭配方案:
    SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
    SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
    SpringCloud - Ribbon:负载均衡
    SpringCloud - Feign:声明式 HTTP 客户端(调用远程服务)
    SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
    SpringCloud - Gateway:API 网 关 (webflux编程模式 )
    SpringCloud - Sleuth:调用链监控
    SpringCloud Alibaba - Seata:原Fescar,即分布式事务解决方案

  • ⑥. 在common引入dependencyManagement依赖管理,相当于以后在dependencies里引spring cloud alibaba就不用写版本号。注意他和普通依赖的区别,他只是备注一下,并没有加入依赖

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

②. SpringCloud Alibaba-Nacos作为注册中心

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

  • ②. nacos官网地址

  • ③. 下载 nacos-server,启动 nacos-server

  1. 双击bin中的startup.cmd文件
  2. 访问http://localhost:8848/nacos/
  3. 使用默认的nacos/nacos进行登录
  • ④. 依赖:放到common里,不写版本是因为父项目或spring-cloud里面有了版本管理
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • ⑤. 使用nacos:在某个项目里properties里写spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 (yaml同理,指定nacos的地址)。再指定applicatin.name告诉注册到nacos中以什么命名
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.56.10:3306/gulimall-sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon


mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
      logic-delete-value: 1
      logic-not-delete-value: 0

server:
  port: 7000
  • ⑥. 使用@EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication 
    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

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

  • ⑦. 然后依次给member、配置上面的yaml,改下name就行。再给每个项目配置类上加上注解@EnableDiscoveryClient

  • ⑧. nacos使用三步走:

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

③. 声明式远程调用 Feign

  • ①. feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求
    会员服务想要远程调用优惠券服务,只需要给会员服务里引入openfeign依赖,他就有了远程调用其他服务的能力

  • ②. 引入依赖pom.xml(我们之前在member的pom.xml已经引用过了(微服务))

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • ③. 在coupon中修改如下的内容,这样我们准备好了优惠券的调用内容
@RequestMapping("coupon/coupon")
public class CouponController 
    @Autowired
    private CouponService couponService;

    @RequestMapping("/member/list")
    public R membercoupons()    //全系统的所有返回都返回R
        // 应该去数据库查用户对于的优惠券,但这个我们简化了,不去数据库查了,构造了一个优惠券给他返回
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100-10");//优惠券的名字
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    

  • ④. 在member的配置类上加注解@EnableDiscoveryClient,告诉member是一个远程调用客户端,member要调用东西的
/*
 * 想要远程调用的步骤:
 * 1 引入openfeign
 * 2 编写一个接口,接口告诉springcloud这个接口需要调用远程服务
 * 	2.1 在接口里声明@FeignClient("gulimall-coupon")他是一个远程调用客户端且要调用coupon服务
 * 	2.2 要调用coupon服务的/coupon/coupon/member/list方法
 * 3 开启远程调用功能 @EnableFeignClients,要指定远程调用功能放的基础包
 * */
@SpringBootApplication
@MapperScan("com.xiaozhi.gulimall.member.dao")
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.xiaozhi.gulimall.member.feign")
public class GulimallMemberApplication 

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

  • ⑤. 那么要调用什么东西呢?就是我们刚才写的优惠券的功能,复制函数部分,在member的com.xiaozhi.gulimall.member.feign包下新建类:
@FeignClient("gulimall-coupon") //告诉spring cloud这个接口是一个远程客户端,要调用coupon服务(nacos中找到),具体是调用coupon服务的/coupon/coupon/member/list对应的方法
public interface CouponFeignService 
    // 远程服务的url
    @RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射//注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
    public R membercoupons();//得到一个R对象

  • ⑥. 然后我们在member的控制层写一个测试请求
@RestController
@RequestMapping("member/member")
public class MemberController 
    @Autowired
    private MemberService memberService;

    @Autowired
    CouponFeignService couponFeignService;

    @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"));
    
  • ⑦. 测试:http://localhost:8000/member/member/coupons

  • ⑧. 上面讲的内容很重要,我们停留5分钟体会一下调用逻辑(coupon里的R.ok()是什么,就是设置了个msg)

public class R extends HashMap<String, Object> //R继承了HashMap
    // ok是个静态方法,new了一个R对象,并且
    public static R ok(String msg) 
        R r = new R();
        r.put("msg", msg);//调用了super.put(key, value);,即hashmap的put
        return r;
    

  • ⑨. 总结Fiegn步骤:
  1. 引入openfeign依赖
  2. 编写一个接口,接口告诉springcloud这个接口需要调用远程服务
    在接口里声明@FeignClient(“gulimall-coupon”)他是一个远程调用客户端且要调用coupon服务
    要调用coupon服务的/coupon/coupon/member/list方法
  3. 开启远程调用功能@EnableFeignClients,要指定远程调用功能放的基础包

④. SpringCloud Alibaba-Nacos作为配置中心

  • ①. 配置中心的意思是不在application.properties等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改

  • ②. Nacos作为配置中心地址

  • ③. common中添加依赖nacos配置中心

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
  • ④. 在coupons项目中创建/src/main/resources/bootstrap.properties,这个文件是springboot里规定的,它的优先级别比application.properties高
    注意:这里一定要配置application.name和配置中心的地址
# 改名字,对应nacos里的配置文件名
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • ⑤. 如果nacos和本地都配置了,会优先使用nacos中的配置
    Loading nacos data…启动项目info输出的信息,告诉我们gulimall-coupon.properties是nacos中默认的配置文件名字

@RestController
@RequestMapping("coupon/coupon")
@RefreshScope //这个注解可以达到nacos配置中心的文件变了之后,可以进行动态的刷新
public class CouponController 
    @Autowired
    private CouponService couponService;

    @Value("$coupon.user.name")
    private String name;
    @Value("$coupon.user.age")
    private String age;

    @RequestMapping("/nacos/config/simple")
    public R nacosConfigSimple()
        return R.ok().put("name",name).put("age",age);
    

  • ⑥. 命名空间:用作配置隔离(一般每个微服务一个命名空间)
  1. 默认public。默认新增的配置都在public空间下
  2. 开发、测试、开发可以用命名空间分割。properties每个空间有一份。也可以为每个微服务配置一个命名空间,微服务互相隔离
  3. 在bootstrap.properties里配置(测试完去掉,学习不需要)
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
  • ⑦. 配置集:所有的配置的集合(比如application.yaml文件里面有很多配置,全部的配置组成了配置集)

  • ⑧. 配置集ID:类似于配置文件名,即Data ID

  • ⑨. 配置分组:默认所有的配置集都属于DEFAULT_GROUP。(双十一,618的优惠策略改分组即可)

# 更改配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP
  • ⑩. 最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)

  • ⑩①. 加载多配置集
    我们要把原来application.yml里的内容都分文件抽离出去。我们在nacos里创建好后,在coupons里指定要导入的配置即可(bootstrap.properties)

# 在其中用数组spring.cloud.nacos.config.extension-configs[]写明每个配置集
spring.application.name=gulimall-coupon

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
# 更改配置分组
spring.cloud.nacos.config.group=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
#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
#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

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.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=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true
  • ⑩②. 总结:如何使用Nacos作为配置中心统一管理配置
(1). 引入依赖
	 <dependency>
		 <groupId>com.alibaba.cloud</groupId>
		 <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
	 </dependency>
 (2). 创建一个bootstrap.properties。
	 spring.application.name=gulimall-coupon
	 spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 (3). 需要给配置中心默认添加一个叫数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties
 (4). 给应用名.properties 添加任何配置
 (5). 动态获取配置。
	 @RefreshScope:动态获取并刷新配置
	 @Value("$配置项的名"):获取到配置。
	 如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。

以上是关于商城项目04_SpringCloud Alibaba概述Nacos作为注册配置中心声明式远程调用Feign的主要内容,如果未能解决你的问题,请参考以下文章

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)九(设置nginx保存图片的代理路径,修改和删除品牌)

spring cloud 与 spring boot 和 spring cloud alibab 版本号对应

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)三(后台搭建)

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十三(项目打包和部署)

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)二十三(项目打包和部署)

Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十九(用户中心)