Springcloud Alibaba



初极狭,才通人。复行数十步,豁然开朗。

引入

从文章的题目也可以看出, 我们本篇文章即将阐述的重心便是Springcloud Alibaba, 会依次涉及各组件的知识.

如果您以前对SpringCloud特别熟悉, 那便再好不过了. 如果确实之前不太了解, 大家可以先移步SpringCloud系列知识, 在该系列中我们详细介绍了基于Netflix的SpringCloud知识.

简介

在我们熟悉的微服务系统中, 会包含如下几个必要的组件

  • Netflix Eureka 注册中心, 服务发现
  • Spring Cloud Config 分布式配置中心
  • Netflix Zuul 服务网关
  • Netflix Hystrix + Dashboard + Turbine 断路器与链路跟踪
  • Netflix Ribbon 客户端负载均衡
  • Netflix Fegin 基于Ribbon的接口式客户端

其中注册中心和配置中心以及客户端和服务端是一个微服务系统中比较重要的, 剩下的熔断器或者链路跟踪其实对于中型企业来说, 不是那么重要, 因为自身的业务导致整个系统的链路复杂度或者调用的频率都不是很高. 所以可有可无.

上面我们介绍了微服务中一些核心的组成部分, 我们现在进入正题看下SpringCloud Alibaba的解决方案

  • Nacos = Eureka/Consule + Config + Admin 注册中心, 配置中心
  • Sentinel = Hystrix + Dashboard + Turbine 断路器链路跟踪
  • Dubbo = Ribbon + Feign 客户端调用方案

以上便是SpringCloud Alibaba的解决方案, 可以看到, 从组件的数量上来说少了一些, 它把一些功能进行了一下分类合并. 从数量来说是少了, 从对开发人员的友好程度上来说也稍微友好了一些, 我们下面分别阐述一下

Nacos

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
使用Nacos作为微服务架构中的注册中心(替代:eurekba、consul等传统方案)以及配置中心(spring cloud config)来使用

起步

以上采取任何一种方式都可以, 在这里Demo通用的方式一, 下载之后直接解压. 运行start脚本启动, 然后通过浏览器访问: http://127.0.0.1:8848/nacos/默认端口是 8848, 这些配置都可以通过配置文件自定义. 浏览器打开之后便是如下界面
在这里插入图片描述
通过左侧列表, 我们看到了他所包含的几个选项, 首先我们来看一下配置中心

当我们的任何一个服务注册到Nacos便可以直接修改配置.

配置中心

首先我们创建一个springboot(我的版本为2.2.5.RELEASE)项目, 引入以下核心依赖

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

然后我们在配置文件目录下新建一个bootstrap.properties里面配置Nacos地址以及应用名称
在这里插入图片描述
紧接着我们新建一个ConfigController来进行动态测试

package com.example.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
	
	@Value("${useLocalCache:false}")
    private boolean useLocalCache;
	
	@Value("${hello}")
    private String hello;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
    
    @RequestMapping("/hello")
    public String hello() {
        return hello;
    }
}

调用Nacos Open API将配置发布到Nacos服务器。假设dataId为example.properties,内容为useLocalCache=true

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true"

然后我们从Nacos控制台观察一下配置
在这里插入图片描述
然后我们在浏览器请求一下写好的测试接口http://localhost:8005/config/hello会返回123. 当我们在nacos中修改了hello的值为change-later之后我们再请求一下, 立马发生了改变.
在这里插入图片描述
这个便是他配置中心的功能, 从操作的便利以及友好程度上来说比较好, 而且支持多种类型的配置文件.

注册中心
服务提供者

首先, 我们还是再新建一个工程, 作为服务提供者, 注册到注册中心, 引入以下核心依赖

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

修改application.properties配置文件分别对应服务端口号, 以及nacos地址
在这里插入图片描述
启动类

package com.felix.cloudprovider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

然后我们再建立一个Controller供测试

package com.felix.cloudprovider.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Controller {
	@RequestMapping(value = "/echo/{param}", method = RequestMethod.GET)
	public String echo(@PathVariable String param) {
		return "Hello " + param;
	}
}
客户端

首先还是引入依赖, 因为我们打算用Fegin调用(所以我多引入了openfeign), 当然也可以用Dubbo来实现调用

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
	<version>2.2.1.RELEASE</version>
</dependency>

还是修改配置文件
在这里插入图片描述
然后我们就和传统的方式调用一样, 写一个FeignClient来实现调用即可

依旧写一个Controller方便浏览器测试

package com.felix.cloudconsumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Controller {
	@Autowired
	private FeignInteface feignClient;
	
	@RequestMapping(value = "/consumer/{param}", method = RequestMethod.GET)
	public String echo(@PathVariable String param) {
		return feignClient.echo(param);
	}
}

启动之后访问查看返回结果
在这里插入图片描述

与此同时我们在回过头来看看Nacos那边的样子
在这里插入图片描述
可以看到我们的服务端和客户端都注册上来了, 并且还可以通过界面进行一些简单的配置

那么关于nacos剩下的就是一个命名空间集群的管理也好实现, 在这里我没进行Demo.





Sentinel

说完了Nacos我们紧接着看一下另一个组件Sentinel

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

官方说的特性有如下:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
    在这里插入图片描述
起步

关于Sentinel的使用方式和Nacos是一样的, 既可以拉去代码进行定制化之后打包编译, 也可以直接下载程序,起步即可.

我们在这里采用方式二进行Demo, 下载完成之后还是启动(截图是我调用完之后的截图)
在这里插入图片描述
可以看到这个界面比Netflix要友好的很多, 包含了链路调用监控, 以及限流规则, 以及熔断等等配置, 可以说是很全面了.

客户端和服务端连接Sentinel实现监控

我们在上面的两个工程中, 分别添加如下依赖

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
	<version>2.2.0.RELEASE</version>
</dependency>

服务端application.properties配置文件中添加sentinel地址

spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080

客户端application.properties配置文件中添加sentinel地址因为我们使用了Fegin所以需要再开启fegin的支持

spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080
feign.sentinel.enabled=true

然后再我们的上一步的FeignClient中简单改造一下写一个fallback测试一下降级处理

package com.felix.cloudconsumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(value = "service-provider",fallback = EchoServiceFallback.class, configuration = FeignConfiguration.class)
public interface FeignInteface {
	
	@RequestMapping(value = "/echo/{param}", method = RequestMethod.GET)
	String echo(@PathVariable("param") String param);
}

class FeignConfiguration {
    @Bean
    public EchoServiceFallback echoServiceFallback() {
        return new EchoServiceFallback();
    }
}

class EchoServiceFallback implements FeignInteface {
    @Override
    public String echo(@PathVariable("param") String param) {
        return "echo fallback";
    }
}

分别配置完成之后, 启动服务端和客户端, 并且不断请求测试便可以从Sentinel中看到下面的调用轨迹了
在这里插入图片描述
然后我们通过页面流控规则配置了一个限流来测试一下
在这里插入图片描述
配置好之后, 我们不停的请求来进行测试, 可以看到当我们请求太频繁的时候, 我们写的fallback生效了
在这里插入图片描述
那么到这里, 我们关于Sentinel的介绍也到这了

剩下关于服务调用Dubbo其实出来的时间比较早, 而且那个东西, 我一直觉得别扭, 所以我在本篇文章中, 还是使用Feign来实现的.当然大家也可以自己尝试一下使用Dubbo, 实现的时候其实也算便捷

总结

在本文中, 我们使用SpringCloud Alibaba的解决方案来简单搭建了一个微服务的Demo进行比较, 总的来说, 使用起来还是比较容易的. 我觉得比Netflix那一套实现起来会更容易上手. 而且组件的封装也比较全,

关于注册中心配置中心以及熔断器等等如果中小型公司不需要定制的话甚至可以做到开箱即用而且交互界面也比较友好, 只需要花心思编写自己的服务提供者服务消费者即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值