初极狭,才通人。复行数十步,豁然开朗。
从文章的题目也可以看出, 我们本篇文章即将阐述的重心便是Springcloud Alibaba
, 会依次涉及各组件的知识.
如果您以前对SpringCloud
特别熟悉, 那便再好不过了. 如果确实之前不太了解, 大家可以先移步SpringCloud系列知识, 在该系列中我们详细介绍了基于Netflix
的SpringCloud知识.
在我们熟悉的微服务系统中, 会包含如下几个必要的组件
其中注册中心和配置中心以及客户端和服务端是一个微服务系统中比较重要的, 剩下的熔断器或者链路跟踪其实对于中型企业来说, 不是那么重要, 因为自身的业务导致整个系统的链路复杂度或者调用的频率都不是很高. 所以可有可无.
上面我们介绍了微服务中一些核心的组成部分, 我们现在进入正题看下SpringCloud Alibaba
的解决方案
以上便是SpringCloud Alibaba
的解决方案, 可以看到, 从组件的数量上来说少了一些, 它把一些功能进行了一下分类合并. 从数量来说是少了, 从对开发人员的友好程度上来说也稍微友好了一些, 我们下面分别阐述一下
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
使用Nacos作为微服务架构中的注册中心(替代:eurekba、consul等传统方案)以及配置中心(spring cloud config)来使用
。
方式一: 直接下载程序, 对配置文件进行修改即可, 好比部署一个Redis
或者Mysql
方式二: 从GitHub下载源码, 可以根据自己的需求修改源码, 然后重新打包即可
以上采取任何一种方式都可以, 在这里Demo通用的方式一, 下载之后直接解压. 运行start
脚本启动, 然后通过浏览器访问: http://127.0.0.1:8848/nacos/
默认端口是 8848, 这些配置都可以通过配置文件自定义. 浏览器打开之后便是如下界面
通过左侧列表, 我们看到了他所包含的几个选项, 首先我们来看一下配置中心
当我们的任何一个服务注册到Nacos
便可以直接修改配置.
首先我们创建一个springboot(我的版本为2.2.5.RELEASE
)项目, 引入以下核心依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
2.2.0.RELEASE
然后我们在配置文件目录下新建一个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
之后我们再请求一下, 立马发生了改变.
这个便是他配置中心的功能, 从操作的便利以及友好程度上来说比较好, 而且支持多种类型的配置文件.
服务提供者
首先, 我们还是再新建一个工程, 作为服务提供者, 注册到注册中心, 引入以下核心依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2.2.0.RELEASE
修改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来实现调用
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2.2.0.RELEASE
org.springframework.cloud
spring-cloud-starter-openfeign
2.2.1.RELEASE
还是修改配置文件
然后我们就和传统的方式调用一样, 写一个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.
说完了Nacos
我们紧接着看一下另一个组件Sentinel
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
官方说的特性有如下:
丰富的应用场景
:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控
:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。广泛的开源生态
:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。完善的 SPI 扩展点
:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。关于Sentinel
的使用方式和Nacos是一样的, 既可以拉去代码进行定制化之后打包编译, 也可以直接下载程序,起步即可.
我们在这里采用方式二进行Demo, 下载完成之后还是启动(截图是我调用完之后的截图)
可以看到这个界面比Netflix要友好的很多, 包含了链路调用监控, 以及限流规则, 以及熔断等等配置, 可以说是很全面了.
我们在上面的两个工程中, 分别添加如下依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2.2.0.RELEASE
服务端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
那一套实现起来会更容易上手. 而且组件的封装也比较全,
关于注册中心配置中心以及熔断器等等
如果中小型公司不需要定制的话甚至可以做到开箱即用而且交互界面也比较友好, 只需要花心思编写自己的服务提供者
和服务消费者
即可