分布式组件 SpringCloud Alibaba 、SpringCloud

分布式组件 SpringCloud Alibaba 、SpringCloud

一、SpringCloud Alibaba

阿里18年开发的微服务一站式解决方案。

二、Nacos 注册中心

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

作为我们的注册中心和配置中心。

注册中心文档:

使用步骤:

前提,已开启 nacos客户端

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

Windows 操作系统,执行命令 cmd startup.cmd

1、首先,修改 pom.xml 文件

引入 Nacos Discovery Starter。

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

2、启动项添加 @EnableDiscoveryClient

开启服务注册与发现功能

3、配置文件中配置 Nacos Server 地址

在 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址(或在yaml中按格式配置)

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

4、http://127.0.0.1:8848/nacos/

账号密码 :nacos

如果没发现服务,需配置服务名 properties 里面

spring.application.name=name001

三、OpenFeign 远程调用

声明式远程调用

feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。

1、引入依赖

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

2、服务

第一个项目 coupon

@RequestMapping("coupon/coupon")
public class CouponController {

    @Autowired
    private CouponService couponService;

    @RequestMapping("/member/list")
    public R membercoupons(){ 
        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,要指定远程调用功能放的基础包
* */
@EnableFeignClients(basePackages="....member.feign") //包下的 feign文件夹
@EnableDiscoveryClient
@SpringBootApplication
public class gulimallMemberApplication {

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

对应的 coupon接口

@FeignClient("gulimall-coupon") //告诉spring cloud这个接口是一个远程客户端,要调用coupon服务,再去调用coupon服务/coupon/coupon/member/list对应的方法
public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射//注意我们这个地方不熟控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
    public R membercoupons();//得到一个R对象
}

memeber 写一个测试请求

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

启动服务,OK!!

四、Nacos 配置中心

我们还可以用nacos作为配置中心。

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

官方教程:
https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md

1、引入配置中心依赖,放到common中

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

2、bootstrap.properties 设置变量

在coupons项目中创建/src/main/resources/bootstrap.properties ,这个文件是springboot里规定的,他优先级别application.properties高

# 改名字,对应nacos里的配置文件名
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

以前更改properties 每次都要重新部署

@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")//从application.properties中获取//不要写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);
    }
# coupon.properties
coupon.user.name="配置中心"      
coupon.user.age=12

3、修改肿么办?

实际生产中不能重启应用。在coupon的控制层上加 @RefreshScope

4、浏览器去nacos里的配置列表,

  • 点击+号
  • data ID:coupon.properties,配置详细信息
  • 重启后,在nacos浏览器里修改配置,修改就可以观察到能动态修改了
  • nacos的配置内容优先于项目本地的配置内容。

配置中心进阶

在nacos浏览器中还可以配置:

  • 命名空间:用作配置隔离。(一般每个微服务一个命名空间)

    • 默认public。默认新增的配置都在public空间下
    • 开发、测试、开发可以用命名空间分割。properties每个空间有一份。
    • 在bootstrap.properties里配置
    # 可以选择对应的命名空间 # 写上对应环境的命名空间ID
    spring.cloud.nacos.config.namespace=b176a68a
    
    • 也可以为每个微服务配置一个命名空间,微服务互相隔离
  • 配置集:一组相关或不相关配置项的集合。

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

  • 配置分组:默认所有的配置集都属于DEFAULT_GROUP。双十一,618,双十二

# 更改配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP

最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)

五、Gateway 网关

网关常用功能包括路由转发、权限效验、限流控制。(路由、断言、过滤器)

SpringCloud Gateway 官方推出的第二代网关,取代了第一代网关Zuul

1、开启服务注册与发现

@EnableDiscoveryClient

排除 DataSouse数据源
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

2、示例:

yaml

spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu

访问 http://localhost:88/hello?url=du ,带有baidu跳转页面


原文:分布式组件 SpringCloud Alibaba 、SpringCloud_com-alibaba-cloud和spring-cloud-CSDN博客
作者: 小心仔