Spring Cloud Alibaba简介, nacos和feign组件的使用

一:SpringCloud Alibaba 简介

谷粒商城

在这里插入图片描述

1)简介

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

https://github.com/alibaba/spring-cloud-alibaba

2)为什么使用

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

3)版本选择

由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
 1.5.x 版本适用于 Spring Boot 1.5.x
 2.0.x 版本适用于 Spring Boot 2.0.x
 2.1.x 版本适用于 Spring Boot 2.1.x

4)引入spring cloud依赖

在 common 项目中引入如下。进行统一管理

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

在这里插入图片描述

二:SpringCloud Alibaba-Nacos[作为注册中心]

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境.
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html

1) 下载 nacos-server

1.下载地址

 https://github.com/alibaba/nacos/releases

在这里插入图片描述
下载1.4.3版本的进行开发
2.启动 nacos-server

  • 双击 bin 中的 startup.cmd 文件
    在这里插入图片描述
  • 访问
http://localhost:8848/nacos/
  • 使用默认的 nacos/nacos 进行登录
    在这里插入图片描述

2) 将微服务注册到 nacos 中

1.首先在common的pom文件中引入Nacos Discovery Starter

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

2.在本机微服务中配置nacos地址
coupon,product,member,order,ware依次加入配置

#数据源
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/gulimail_sms
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    #nacos地址
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3.使用@EnableDiscoveryClient 开启服务注册发现功能
在每个微服务项目的启动类中添加@EnableDiscoveryClient注解

package com.sysg.gulimail.coupon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;//
/**
 * @EnableDiscoveryClient
 * 启用服务的注册发现功能
 */
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailCouponApplication {

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

4.启动应用,观察 nacos 服务列表是否已经注册上服务
为每个服务添加服务名称,其他模块类似

spring:
#服务的名称,用于让nacos知道那个服务正在被调用
  application:
    name: gulimail-coupon

在这里插入图片描述

三:微服务之间的调用----Feign

问题:如果此时我们想从一个微服务1获取数据传输到另一个微服务2,我们应该怎么做?
解答:微服务1先去注册中心nacos去查找想调用的微服务2,在那些服务器上,nacos返回服务器相关信息,然后微服务1通过这些信息调用微服务2,两个微服务之间相互传输数据。

1.简介

  • Feign 是一个声明式的 HTTP 客户端,它的目的就是让远程调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地 址等信息。
  • Feign 整合了 Ribbon(负载均衡)和 Hystrix(服务熔断),可以让我们不再需要显式地使用这 两个组件。
  • SpringCloudFeign 在 NetflixFeign 的基础上扩展了对 SpringMVC 注解的支持,在其实现下,我 们只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了 SpringCloudRibbon 自行封装服务调用客户端的开发量。

2.使用

场景gulimail-member从gulimail-coupon获取相关数据
1)首先引入依赖,该微服务才可以去调用其他微服务,获取数据

 <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>
  1. 在coupon微服务里面添加相关测试方法
    在CouponController添加测试方法----被调用者
/**
     * 这个方法用来测试微服务之间的调用
     * member向coupon获取信息
     * @return
     */
    @RequestMapping("/member/list")
    public R memberCoupons(){
        CouponEntity entity = new CouponEntity();
        entity.setCouponName("满100减10");
        List<CouponEntity> list = Arrays.asList(entity);
        return R.ok().put("coupons", list);
    }

3)在coupon项目的启动类添加相关注解
一:想要远程调用别的服务

  • 1)引入open-feign
  • 2)编写一个接口,告诉spring cloud这个接口需要远程服务调用
    1> 声明接口的每一个方法都是调用那个远程服务的请求
  • 3)开启远程调用功能
package com.sysg.gulimail.member;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
 * 想要远程调用别的服务
 *  1.引入open-feign
 *  2.编写一个接口,告诉spring cloud这个接口需要远程服务调用
 *      1> 声明接口的每一个方法都是调用那个远程服务的请求
 * 3.开启远程调用功能
 * 只要服务一起动,就会自动扫描有@feignClient的方法
 */
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.sysg.gulimail.member.feign")
@SpringBootApplication
public class GulimailMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(GulimailMemberApplication.class, args);
    }
}

二:在gulimail-member新建一个feign包,新建一个CouponFeignService文件
1.@FeignClient 告诉spring cloud这个接口需要调用远程客户端
2.gulimail-coupon 需要调用客户端的服务名
3.方法里面写需要远程调用的方法
* @RequestMapping的路径一点要是全路径
* 方法就是需要远程调用的方法

package com.sysg.gulimail.member.feign;

import com.sysg.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author sysg
 * @FeignClient 告诉spring cloud这个接口需要调用远程客户端
 * gulimail-coupon 需要调用客户端的服务名
 */
@FeignClient("gulimail-coupon")
public interface CouponFeignService {
    /**
     * 需要远程调用的方法名
     * 并且@RequestMapping的路径一点要是全路径
     * @return
     */
    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupons();
}

三:测试远程调用
在MemberController添加方法,调用CouponFeignService的memberCoupons方法

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

在common的pom文件中引入依赖

         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

将coupon和member服务跑起来,访问

http://127.0.0.1:8000/member/member/coupons

在这里插入图片描述

四:SpringCloud Alibaba-Nacos[作为配置中心]

1、在common的pom.xml 引入 Nacos Config Starter依赖。

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

2.在coupon的应用的 /src/main/resources/bootstrap.properties配置文 件中配置 Nacos Server 地址

#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

在coupon的应用的 /src/main/resources/application.properties配置文 件中配置需求要调用的信息

coupon.user.name=zhangsan
coupon.user.age=18

在CouponController中添加测试方发

    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;
    @RequestMapping("/test")
    public R  test (){
        return R.ok().put("name",name).put("age",age);
    }

访问
127.0.0.1:7000/coupon/coupon/test
进行测试
在这里插入图片描述
问题:如果此时想修改name和age的值,只能修改配置文件,然后重新启动项目,如果十台服务器都部署了该项目,就要重启十台服务器,这非常麻烦,有什么简单的方法呢?
解答:可以在nacos客户端添加配置
首先在CouponController添加@RefreshScope注解,此注解作用就是动态刷新配置

@RefreshScope
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;
    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;
    @RequestMapping("/test")
    public R  test (){
        return R.ok().put("name",name).put("age",age);
    }

然后再common引入bootstrap依赖

        <!--bootstrap依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.1</version>
        </dependency>

在这里插入图片描述
点击编辑,即可修改配置
在这里插入图片描述
在这里插入图片描述
输出的内容

{"msg":"success","code":0,"name":"sysg","age":24}

五:总结

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

1)引入依赖

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

2)创建一个bootstrap.properties文件

#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

3)给配置中心,默认添加数据集(Data Id) gulimail-conpon.properties data-id()
默认规则:当前应用名+properties
4)给应用名+properties添加任何配置
5)动态刷新配置
@RefreshScope:动态获取并刷新配置
@value(“${配置项的名}”):获取配置
如果配置中心和当前应用都配置了相同的项,优先使用配置中心的配置

2.细节

1)命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的 配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。
首先在命名空间中添加dev,test,prop作为命名空间
在这里插入图片描述
然后我们就可以在配置列表里面选择这些命名空间了
在prop生产环境添加类似配置,点击发布
在这里插入图片描述
问题:默认会访问public里面的配置信息,怎么样才可以访问prop环境呢?
解答:首先复制prop环境的ID
在这里插入图片描述
其次,在coupon的bootstrap.properties添加一处配置即可

#应用名称
spring.application.name=gulimail-coupon
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置命名空间
spring.cloud.nacos.config.namespace=7836c7b5-0e40-473d-aa29-633308caa2d9

结论:
1.所以我们可以利用命名空间做环境隔离
2.每一个微服务之间都相互隔离配置,为每一个微服务都添加命名空间,只加载自己的配置
3.我们可以基于环境或者微服务之间进行隔离
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 配置。
注:我们可以把application.yml的配置文件提取出来,然后统一让nacos配置中心进行管理
1.将application.yml文件当中的datasource提取出来,如下进行配置,并发布
2.将application.yml文件当中的mybatis提取出来,如下进行配置,并发布
在这里插入图片描述
3.将application.yml文件当中的其他配置提取出来,如下进行配置,并发布
在这里插入图片描述
配置列表
在这里插入图片描述
问题:这些配置文件都是我们所需要使用的,所以我们如何统一启动这些配置文件
解答:在bootstrap.properties文件添加相关配置,即可解决问题。

#拓展配置
#data-id
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#dev分组
spring.cloud.nacos.config.ext-config[0].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[0].refresh=true

#data-id
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
#dev分组
spring.cloud.nacos.config.ext-config[1].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[1].refresh=true

#data-id
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
#dev分组
spring.cloud.nacos.config.ext-config[2].group=dev
#动态刷新
spring.cloud.nacos.config.ext-config[2].refresh=true

测试:
此时我们注释掉coupon的application.yml文件,看添加的配置是否生效。重启coupon项目。
在这里插入图片描述
springboot中从配置文件中获取值,都能使用。配置中心有的优先使用配置中心。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随意石光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值