SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。
依托SpringCloudAlibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
目前SpringCloudAlibaba提供了如下功能:
SpringCloudAlibabaBOM包含了它所使用的所有依赖的版本。
如果您是MavenCentral用户,请将我们的BOM添加到您的pom.xml中的部分。这将允许您省略任何Maven依赖项的版本,而是将版本控制委派给BOM。
Nacos是一个Alibaba开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
使用SpringCloudAlibabaNacosDiscovery,可基于SpringCloud的编程模型快速接入Nacos服务注册功能。
如果要在您的项目中使用Nacos来实现服务注册/发现,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alibaba-nacos-discovery的starter。
Figure1.NacosDashboard
以下步骤向您展示了如何将一个服务注册到Nacos。
pom.xml
server.port=8081spring.application.name=nacos-providerspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848management.endpoints.web.exposure.include=*NOTE如果不想使用Nacos作为您的服务注册与发现,可以将spring.cloud.nacos.discovery设置为false。@SpringBootApplication@EnableDiscoveryClientpublicclassNacosProviderDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(NacosProviderDemoApplication.class,args);}@RestControllerpublicclassEchoController{@GetMapping(value="/echo/{string}")publicStringecho(@PathVariableStringstring){return"HelloNacosDiscovery"+string;}}}这个时候你就可以在Nacos的控制台上看到注册上来的服务信息了。
Consumer应用可能还没像启动一个Provider应用那么简单。因为在Consumer端需要去调用Provider端提供的REST服务。例子中我们使用最原始的一种方式,即显示的使用LoadBalanceClient和RestTemplate结合的方式来访问。pom.xml和application.properties的配置可以参考1.2小结。启动一个Consumer应用的示例代码如下所示:
Endpoint暴露的json中包含了两种属性:
这是Endpoint暴露的json示例:
{"subscribe":[{"jsonFromServer":"","name":"nacos-provider","clusters":"","cacheMillis":10000,"hosts":[{"instanceId":"30.5.124.156#8081#DEFAULT#nacos-provider","ip":"30.5.124.156","port":8081,"weight":1.0,"healthy":true,"enabled":true,"cluster":{"serviceName":null,"name":null,"healthChecker":{"type":"TCP"},"defaultPort":80,"defaultCheckPort":80,"useIPPort4Check":true,"metadata":{}},"service":null,"metadata":{}}],"lastRefTime":1541755293119,"checksum":"e5a699c9201f5328241c178e804657e11541755293119","allIPs":false,"key":"nacos-provider","valid":true}],"NacosDiscoveryProperties":{"serverAddr":"127.0.0.1:8848","endpoint":"","namespace":"","logName":"","service":"nacos-provider","weight":1.0,"clusterName":"DEFAULT","metadata":{},"registerEnabled":true,"ip":"30.5.124.201","networkInterface":"","port":8082,"secure":false,"accessKey":"","secretKey":""}}3.5.如何开启权重路由3.5.1.SpringCloudLoadbalancerpom.xml
spring.cloud.loadbalancer.ribbon.enabled=falsespring.cloud.loadbalancer.nacos.enabled=true3.6.关于NacosDiscoveryStarter更多的配置项信息更多关于NacosDiscoveryStarter的配置项如下所示:
使用SpringCloudAlibabaNacosConfig,可基于SpringCloud的编程模型快速接入Nacos配置管理功能。
如果要在您的项目中使用Nacos来实现配置管理,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alibaba-nacos-config的starter。
下图表示DataId使用myDataid,GROUP使用DEFAULT_GROUP,配置格式为Properties的一个配置项:
Figure2.NacosConfigItem
具体启动方式参考SpringCloudAlibabaNacosDiscovery小节的"NacosServer启动"章节。
NacosServer启动完毕后,添加如何配置:
DataID:nacos-config.propertiesGroup:DEFAULT_GROUP配置格式:Properties配置内容:user.name=nacos-config-propertiesuser.age=90NOTE注意DataId是以properties(默认的文件扩展名方式)为扩展名。4.2.2.客户端使用方式如果要在您的项目中使用Nacos来实现应用的外部化配置,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alibaba-nacos-config的starter。
bootstrap.properties
#DataId默认使用`spring.application.name`配置跟文件扩展名结合(配置格式默认使用properties),GROUP不配置默认使用DEFAULT_GROUP。因此该配置文件对应的NacosConfig配置的DataId为nacos-config.properties,GROUP为DEFAULT_GROUPspring.application.name=nacos-configspring.cloud.nacos.config.server-addr=127.0.0.1:8848NOTE注意当你使用域名的方式来访问Nacos时,spring.cloud.nacos.config.server-addr配置的方式为域名:port。例如Nacos的域名为abc.com.nacos,监听的端口为80,则spring.cloud.nacos.config.server-addr=abc.com.nacos:80。注意80端口不能省略。启动这个Example,可以看到如下输出结果:
2018-11-0214:24:51.638INFO32700---[main]c.a.demo.provider.ConfigApplication:StartedConfigApplicationin14.645seconds(JVMrunningfor15.139)username:nacos-config-properties;age:902018-11-0214:24:51.688INFO32700---[-127.0.0.1:8848]s.c.a.AnnotationConfigApplicationContext:Refreshingorg.springframework.context.annotation.AnnotationConfigApplicationContext@a8c5e74:startupdate[FriNov0214:24:51CST2018];rootofcontexthierarchy4.3.基于DataId为yaml的文件扩展名配置方式NacosConfig除了支持properties格式以外,也支持yaml格式。这个时候只需要完成以下两步:
spring.cloud.nacos.config.file-extension=yaml2、在Nacos的控制台新增一个DataId为yaml为扩展名的配置,如下所示:
DataID:nacos-config.yamlGroup:DEFAULT_GROUP配置格式:YAML配置内容:user.name:nacos-config-yamluser.age:68这两步完成后,重启测试程序,可以看到如下输出结果。
2018-11-0214:59:00.484INFO32928---[main]c.a.demo.provider.ConfigApplication:StartedConfigApplicationin14.183seconds(JVMrunningfor14.671)username:nacos-config-yaml;age:682018-11-0214:59:00.529INFO32928---[-127.0.0.1:8848]s.c.a.AnnotationConfigApplicationContext:Refreshingorg.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e:startupdate[FriNov0214:59:00CST2018];rootofcontexthierarchy4.4.支持配置的动态更新NacosConfig默认支持配置的动态更新,启动SpringBoot应用测试的代码如下:
@SpringBootApplicationpublicclassConfigApplication{publicstaticvoidmain(String[]args){ConfigurableApplicationContextapplicationContext=SpringApplication.run(ConfigApplication.class,args);while(true){//当动态配置刷新时,会更新到Enviroment中,因此这里每隔一秒中从Enviroment中获取配置StringuserName=applicationContext.getEnvironment().getProperty("user.name");StringuserAge=applicationContext.getEnvironment().getProperty("user.age");System.err.println("username:"+userName+";age:"+userAge);TimeUnit.SECONDS.sleep(1);}}}如下所示,当变更user.name时,应用程序中能够获取到最新的值:
spring.profiles.active=developNOTE${spring.profiles.active}当通过配置文件来指定时必须放在bootstrap.properties文件中。Nacos上新增一个DataId为:nacos-config-develop.yaml的基础配置,如下所示:
DataID:nacos-config-develop.yamlGroup:DEFAULT_GROUP配置格式:YAML配置内容:current.env:develop-env启动SpringBoot应用测试的代码如下:
@SpringBootApplicationpublicclassConfigApplication{publicstaticvoidmain(String[]args){ConfigurableApplicationContextapplicationContext=SpringApplication.run(ConfigApplication.class,args);while(true){StringuserName=applicationContext.getEnvironment().getProperty("user.name");StringuserAge=applicationContext.getEnvironment().getProperty("user.age");//获取当前部署的环境StringcurrentEnv=applicationContext.getEnvironment().getProperty("current.env");System.err.println("in"+currentEnv+"enviroment;"+"username:"+userName+";age:"+userAge);TimeUnit.SECONDS.sleep(1);}}}启动后,可见控制台的输出结果:
indevelop-envenviroment;username:nacos-config-yaml-update;age:682018-11-0215:34:25.013INFO33014---[Thread-11]ConfigServletWebServerApplicationContext:Closingorg.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7:startupdate[FriNov0215:33:57CST2018];parent:org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449如果需要切换到生产环境,只需要更改${spring.profiles.active}参数配置即可。如下所示:
spring.profiles.active=product同时生产环境上Nacos需要添加对应DataId的基础配置。例如,在生产环境下的Naocs添加了DataId为:nacos-config-product.yaml的配置:
DataID:nacos-config-product.yamlGroup:DEFAULT_GROUP配置格式:YAML配置内容:current.env:product-env启动测试程序,输出结果如下:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group或DataID的配置。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定${spring.cloud.nacos.config.namespace}配置的情况下,默认使用的是Nacos上Public这个namespace。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7NOTE该配置必须放在bootstrap.properties文件中。此外spring.cloud.nacos.config.namespace的值是namespace对应的id,id值可以在Nacos的控制台获取。并且在添加配置时注意不要选择其他的namespae,否则将会导致读取不到正确的配置。4.7.支持自定义Group的配置在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定义自己的Group,可以通过以下配置来实现:
spring.application.name=opensource-service-providerspring.cloud.nacos.config.server-addr=127.0.0.1:8848#configexternalconfiguration#1、DataId在默认的组DEFAULT_GROUP,不支持配置的动态刷新spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties#2、DataId不在默认的组,不支持动态刷新spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.propertiesspring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP#3、DataId既不在默认的组,也支持动态刷新spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.propertiesspring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUPspring.cloud.nacos.config.ext-config[2].refresh=true可以看到:
通过自定义扩展的DataId配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的DataId,你可以通过以下的方式来配置:
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.propertiesspring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties可以看到:
当三种方式共同使用时,他们的一个优先级关系是:A
NacosConfig内部提供了一个Endpoint,对应的endpointid为nacos-config。
Endpoint暴露的json中包含了三种属性:
{ "NacosConfigProperties":{ "serverAddr":"127.0.0.1:8848", "encode":null, "group":"DEFAULT_GROUP", "prefix":null, "fileExtension":"properties", "timeout":3000, "endpoint":null, "namespace":null, "accessKey":null, "secretKey":null, "contextPath":null, "clusterName":null, "name":null, "sharedDataids":"base-common.properties,common.properties", "refreshableDataids":"common.properties", "extConfig":null }, "RefreshHistory":[{ "timestamp":"2019-07-2911:20:04", "dataId":"nacos-config-example.properties", "md5":"7d5d7f1051ff6571e2ec9f90887d9d91" }], "Sources":[{ "lastSynced":"2019-07-2911:19:04", "dataId":"common.properties" },{ "lastSynced":"2019-07-2911:19:04", "dataId":"base-common.properties" },{ "lastSynced":"2019-07-2911:19:04", "dataId":"nacos-config-example.properties" }]}4.11.完全关闭NacosConfig的自动化配置通过设置spring.cloud.nacos.config.enabled=false来完全关闭SpringCloudNacosConfig
更多关于NacosConfigStarter的配置项如下所示:
如果要在您的项目中引入Sentinel,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alibaba-sentinel的starter。
[source,yaml]
@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceApplication.class,args);}}@RestControllerpublicclassTestController{@GetMapping(value="/hello")@SentinelResource("hello")publicStringhello(){return"HelloSentinel";}}@SentinelResource注解用来标识资源是否被限流、降级。上述例子上该注解的属性'hello'表示资源名。
@SpringBootApplicationpublicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ServiceApplication.class,args);}}@RestControllerpublicclassTestController{@GetMapping("/mono")@SentinelResource("hello")publicMono
注意:集群资源汇总仅支持500台以下的应用集群,有大概1-2秒的延时。
Figure3.SentinelDashboard
开启该功能需要3个步骤:
您也可以从最新版本的源码自行构建Sentinel控制台:
Sentinel控制台是一个标准的SpringBoot应用,以SpringBoot的方式运行jar包即可。
java-Dserver.port=8080-Dcsp.sentinel.dashboard.server=localhost:8080-Dproject.name=sentinel-dashboard-jarsentinel-dashboard.jar如若8080端口冲突,可使用-Dserver.port=新端口进行设置。
application.yml
spring:cloud:sentinel:transport:port:8719dashboard:localhost:8080这里的spring.cloud.sentinel.transport.port端口配置会在应用对应的机器上启动一个HttpServer,该Server会与Sentinel控制台做交互。比如Sentinel控制台添加了1个限流规则,会把规则数据push给这个HttpServer接收,HttpServer再将规则注册到Sentinel中。
SpringCloudAlibabaSentinel支持对RestTemplate的服务调用使用Sentinel进行保护,在构造RestTemplatebean的时候需要加上@SentinelRestTemplate注解。
@Bean@SentinelRestTemplate(blockHandler="handleException",blockHandlerClass=ExceptionUtil.class)publicRestTemplaterestTemplate(){returnnewRestTemplate();}@SentinelRestTemplate注解的属性支持限流(blockHandler,blockHandlerClass)和降级(fallback,fallbackClass)的处理。
其中blockHandler或fallback属性对应的方法必须是对应blockHandlerClass或fallbackClass属性中的静态方法。
publicclassExceptionUtil{publicstaticClientHttpResponsehandleException(HttpRequestrequest,byte[]body,ClientHttpRequestExecutionexecution,BlockExceptionexception){...}}NOTE应用启动的时候会检查@SentinelRestTemplate注解对应的限流或降级方法是否存在,如不存在会抛出异常@SentinelRestTemplate注解的限流(blockHandler,blockHandlerClass)和降级(fallback,fallbackClass)属性不强制填写。
当使用RestTemplate调用被Sentinel熔断后,会返回RestTemplaterequestblockbysentinel信息,或者也可以编写对应的方法自行处理返回信息。这里提供了SentinelClientHttpResponse用于构造返回信息。
SentinelRestTemplate限流的资源规则提供两种粒度:
SentinelProperties内部提供了TreeMap类型的datasource属性用于配置数据源信息。
比如配置4个数据源:
每种数据源都有两个共同的配置项:data-type、converter-class以及rule-type。
data-type配置项表示Converter类型,SpringCloudAlibabaSentinel默认提供两种内置的值,分别是json和xml(不填默认是json)。如果不想使用内置的json或xml这两种Converter,可以填写custom表示自定义Converter,然后再配置converter-class配置项,该配置项需要写类的全路径名(比如spring.cloud.sentinel.datasource.ds1.file.converter-class=org.springframework.cloud.alibaba.cloud.examples.JsonFlowRuleListConverter)。
rule-type配置表示该数据源中的规则属于哪种类型的规则(flow,degrade,authority,system,param-flow,gw-flow,gw-api-group)。
若想跟SentinelStarter配合使用,需要加上spring-cloud-alibaba-sentinel-gateway依赖,同时需要添加spring-cloud-starter-gateway依赖来让spring-cloud-alibaba-sentinel-gateway模块里的SpringCloudGateway自动化配置类生效:
Endpoint暴露的json中包含了多种属性:
SpringCloudAlibabaSentinel提供了这些配置选项
具有以下特点:
解压后的目录结构如下:
apache-rocketmq├──LICENSE├──NOTICE├──README.md├──benchmark├──bin├──conf└──libnohupshbin/mqnamesrv&tail-f~/logs/rocketmqlogs/namesrv.lognohupshbin/mqbroker-nlocalhost:9876&tail-f~/logs/rocketmqlogs/broker.log发送消息:
shbin/tools.shorg.apache.rocketmq.example.quickstart.Producer发送成功后显示:SendResult[sendStatus=SEND_OK,msgId=…
接收消息:
shbin/tools.shorg.apache.rocketmq.example.quickstart.Consumer接收成功后显示:ConsumeMessageThread_%dReceiveNewMessages:[MessageExt…
shbin/mqshutdownbrokershbin/mqshutdownnamesrv6.3.SpringCloudStream介绍SpringCloudStream是一个用于构建基于消息的微服务应用框架。它基于SpringBoot来创建具有生产级别的单机Spring应用,并且使用SpringIntegration与Broker进行连接。
SpringCloudStream提供了消息中间件配置的统一抽象,推出了publish-subscribe、consumergroups、partition这些统一的概念。
SpringCloudStream内部有两个概念:Binder和Binding。
比如Kafka的实现KafkaMessageChannelBinder,RabbitMQ的实现RabbitMessageChannelBinder以及RocketMQ的实现RocketMQMessageChannelBinder。
Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。
Figure4.SpringCloudStream
使用SpringCloudStream完成一段简单的消息发送和消息接收代码:
SpringCloudStream底层基于这段代码去做了各种抽象。
如果要在您的项目中引入RocketMQBinder,需要引入如下maven依赖:
Figure5.SCSRocketMQBinder
MessageBuilderbuilder=MessageBuilder.withPayload(msg).setHeader(RocketMQHeaders.TAGS,"binder").setHeader(RocketMQHeaders.KEYS,"my-key");Messagemessage=builder.build();output().send(message);或者使用StreamBridge
Default:127.0.0.1:9876.
spring.cloud.stream.rocketmq.binder.access-key阿里云账号AccessKey。
Default:null.
spring.cloud.stream.rocketmq.binder.secret-key阿里云账号SecretKey。
spring.cloud.stream.rocketmq.binder.enable-msg-trace是否为Producer和Consumer开启消息轨迹功能
Default:true.
spring.cloud.stream.rocketmq.binder.customized-trace-topic消息轨迹开启后存储的topic名称。
Default:RMQ_SYS_TRACE_TOPIC.
enable是否启用Consumer。
默认值:true.
subscriptionConsumer基于TAGS订阅,多个tag以||分割。更多见com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties.subscription
默认值:empty.
messageModelConsumer消费模式。如果想让每一个的订阅者都能接收到消息,可以使用广播模式。更多见org.apache.rocketmq.common.protocol.heartbeat.MessageModel
默认值:CLUSTERING.
consumeFromWhereConsumer从哪里开始消费。更多见org.apache.rocketmq.common.consumer.ConsumeFromWhere
默认值:CONSUME_FROM_LAST_OFFSET.
orderly是否同步消费消息模式
默认值:false.
delayLevelWhenNextConsume异步消费消息模式下消费失败重试策略:
默认值:1000.
其他更多参数见com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties.Push
pullThreadNums消费时拉取的线程数
默认值:20.
pollTimeoutMillis拉取时的超时毫秒数
默认值:1000*5.
其他更多参数见com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQConsumerProperties.Pull.
enable是否启用Producer。
groupProducergroupname。
maxMessageSize消息发送的最大字节数。
默认值:8249344.
producerType消息生产者类型,普通或者事务。更多见com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties.ProducerType.
默认值:Normal.
transactionListener事务消息监听器的beanName,在producerType=Trans时才有效;必须是实现org.apache.rocketmq.client.producer.TransactionListener接口的SpringBean。
sendType消息发送类型(同步、异步、单向)。更多见com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQProducerProperties.SendType.
默认值:Sync.
sendCallBack消息发送后回调函数的beanName,在sendType=Async时才有效;必须是实现org.apache.rocketmq.client.producer.SendCallback接口的SpringBean。
vipChannelEnabled是否在VipChannel上发送消息。
默认值:3000.
compressMessageBodyThreshold消息体压缩阀值(当消息体超过4k的时候会被压缩)。
默认值:4096.
retryTimesWhenSendFailed在同步发送消息的模式下,消息发送失败的重试次数。
默认值:2.
retryTimesWhenSendAsyncFailed在异步发送消息的模式下,消息发送失败的重试次数。
retryAnotherBroker消息发送失败的情况下是否重试其它的broker。
使用阿里云MQ服务需要配置AccessKey、SecretKey以及云上的NameServer地址。
如果要在您的项目中引入ANS,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alicloud-ans的starter。
以下是一个简单的应用示例。
@SpringBootApplication@EnableDiscoveryClient@RestControllerpublicclassProviderApplication{@RequestMapping("/")publicStringhome(){return"Helloworld";}publicstaticvoidmain(String[]args){SpringApplication.run(ProviderApplication.class,args);}}既然服务会被注册到注册中心,那么肯定需要配置注册中心的地址,在application.properties中,还需要配置上以下地址。
#应用名会被作为服务名称使用,因此会必选spring.application.name=ans-providerserver.port=18081#以下就是注册中心的IP和端口配置spring.cloud.alicloud.ans.server-list=127.0.0.1spring.cloud.alicloud.ans.server-port=8080NOTE此时没有启动注册中心,启动应用会报错,因此在应用启动之前,应当首先启动注册中心。7.3.启动注册中心ANS使用的注册中心有两种,一种是完全免费的轻量版配置中心,主要用于开发和本地调试,一种是云上注册中心,ANS依托于阿里云EDAS产品提供服务注册的功能。通常情况下,可以使用轻量版配置中心作为开发和测试环境,使用云上的EDAS作为灰度和生产环境。
使用云上注册中心,可以省去服务端的维护工作,同时稳定性也会更有保障。当使用云上注册中心时,代码部分和使用轻量配置中心并没有区别,但是配置上会有一些区别。
以下是一个简单的使用云上配置中心的配置示例。
#应用名会被作为服务名称使用,因此是必选spring.application.name=ans-provider#端口配置自由配置即可server.port=18081#以下就是注册中心的IP和端口配置,因为默认就是127.0.0.1和8080,因此以下两行配置也可以省略spring.cloud.alicloud.ans.server-mode=EDASspring.cloud.alicloud.access-key=你的阿里云AKspring.cloud.alicloud.secret-key=你的阿里云SKspring.cloud.alicloud.edas.namespace=cn-xxxxxserver-mode的默认值为LOCAL,如果要使用云上注册中心,则需要更改为EDAS。
SpringCloudAliCloudACM是阿里云提供的商业版应用配置管理(ApplicationConfigurationManagement)产品在SpringCloud应用侧的客户端实现,且目前完全免费。
使用SpringCloudAliCloudACM,可基于SpringCloud的编程模型快速接入ACM配置管理功能。
如果要在您的项目中引入ACM,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alicloud-acm的starter。
@SpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[]args){ConfigurableApplicationContextapplicationContext=SpringApplication.run(ProviderApplication.class,args);StringuserName=applicationContext.getEnvironment().getProperty("user.name");StringuserAge=applicationContext.getEnvironment().getProperty("user.age");System.err.println("username:"+userName+";age:"+userAge);}}在从配置中心服务端获取配置信息之前,还需要配置服务端的地址,在bootstrap.properties中,还需要配置以下信息。
#必选,应用名会被作为从服务端获取配置key的关键词组成部分spring.application.name=acm-configserver.port=18081#以下就是配置中心服务端的IP和端口配置spring.cloud.alicloud.acm.server-list=127.0.0.1spring.cloud.alicloud.acm.server-port=8080NOTE此时没有启动配置中心,启动应用会报错,因此在应用启动之前,应当首先启动配置中心。8.2.1.启动配置中心ACM使用的配置中心有两种,一种是本地运行的轻量版配置中心,主要用于开发和本地调试,一种是阿里云产品ACM。通常情况下,可以使用轻量版配置中心作为开发和测试环境,使用云上的ACM作为灰度和生产环境。
使用云上ACM,可以省去服务端的维护工作,同时稳定性也会更有保障。当使用云上配置中心时,代码部分和使用轻量配置中心并没有区别,但是配置上会有一些区别。
#应用名会被作为从服务端获取配置key的关键词组成部分,因此是必选spring.application.name=acm-config#端口配置自由配置即可server.port=18081#以下就是配置中心的IP和端口配置spring.cloud.alicloud.acm.server-mode=EDASspring.cloud.alicloud.access-key=你的阿里云AKspring.cloud.alicloud.secret-key=你的阿里云SKspring.cloud.alicloud.acm.endpoint=acm.aliyun.comspring.cloud.alicloud.acm.namespace=你的ACMnamespace,需要在ACM控制台查询NOTEEDAS提供应用托管服务,如果你将应用托管到EDAS,那么EDAS将会自动为你填充所有与业务无关的配置。8.2.2.在配置中心添加配置Group:DEFAULT_GROOUPDataId:acm-config.propertiesContent:user.name=jamesuser.age=18NOTEDataId的格式为{prefix}.{file-extension},prefix默认从配置spring.application.name中取值,file-extension默认的值为"properties"。8.2.3.启动应用验证启动这个Example,可以在控制台看到打印出的值正是我们在轻量版配置中心上预先配置的值。
username:james;age:188.3.更改配置文件扩展名spring-cloud-starter-alicloud-acm中DataId默认的文件扩展名是properties。除去properties格式之外,也支持yaml格式。支持通过spring.cloud.alicloud.acm.file-extension来配置文件的扩展名,yaml格式可以配置成yaml或yml。
spring-cloud-starter-alicloud-acm默认支持配置的动态更新,当您在配置中心修改配置的内容时,会发布Spring中的RefreshEvent事件。带有@RefreshScope和@ConfigurationProperties注解的类会自动刷新。
spring-cloud-starter-alicloud-acm在加载配置的时候,首先会加载DataId为{spring.application.name}.{file-extension}的配置,当spring.profiles.active中配置有内容时,还会依次去加载spring.profile对应的内容,DataId的格式为{spring.application.name}-{profile}.{file-extension}的配置,且后者的优先级高于前者。
spring.profiles.active属于配置的元数据,所以也必须配置在bootstrap.properties或bootstrap.yaml中。比如可以在bootstrap.properties中增加如下内容。
spring.profiles.active={profile-name}Note:也可以通过JVM参数-Dspring.profiles.active=develop或者--spring.profiles.active=develop这类优先级更高的方式来配置,只需遵循SpringBoot规范即可。
在没有明确指定{spring.cloud.alicloud.acm.group}配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定义自己的Group,可以通过以下配置来实现:
spring.cloud.alicloud.acm.group=DEVELOP_GROUPNOTE该配置必须放在bootstrap.properties文件中。并且在添加配置时Group的值要和spring.cloud.alicloud.acm.group的配置值一致。8.8.共享配置ACM提供了一种多个应用之间共享配置中心的同一个配置的推荐方式,供多个应用共享一些配置时使用,您在使用的时候需要添加在bootstrap中添加一个配置项spring.application.group。
spring.application.group=company.department.team这时应用在获取上文提到的自身所独有的配置之前,会先依次从这些DataId去获取,分别是company:application.properties,company.department:application.properties,company.department.team:application.properties。然后,还会从{spring.application.group}:{spring.application.name}.{file-extension}中获取,越往后优先级越高,最高的仍然是应用自身所独有的配置。
OSS(ObjectStorageService)是阿里云的一款对象存储服务产品,SpringCloudAliCloudOSS提供了SpringCloud规范下商业版的对象存储服务,提供简单易用的API,并且支持与Spring框架中Resource的整合。
如果要在您的项目中引入OSS,使用groupID为org.springframework.cloud和artifactID为spring-cloud-starter-alicloud-oss的starter。
SpringCloudAlicloudOSS中的OSSAPI基于阿里云官方OSSSDK提供,具备上传、下载、查看等所有对象存储类操作API。
一个简单的使用OSSAPI的应用如下。
SpringCloudAliCloudOSS整合了Spring框架的Resource规范,可以让用户很方便的引用OSS的资源。
一个简单的使用Resource的例子如下。
除了基本的配置项以外,SpringCloudAliCloudOSS还支持很多额外的配置,也是在application.properties文件中。
以下是一些简单的示例。
SchedulerX(分布式任务调度)是隶属于阿里云EDAS产品的组件,SpringCloudAliCloudSchedulerX提供了在SpringCloud的配置规范下,分布式任务调度的功能支持。SchedulerX可提供秒级、精准、高可靠、高可用的定时任务调度服务,并支持多种类型的任务调度,如简单单机任务、简单多机任务、脚本任务以及网格任务。
如果要在您的项目中引入SchedulerX,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alicloud-schedulerX的starter。
@SpringBootApplicationpublicclassScxApplication{publicstaticvoidmain(String[]args){SpringApplication.run(ScxApplication.class,args);}}在application.properties中,需要加上以下配置。
简单任务是最常用的任务类型,只需要实现ScxSimpleJobProcessor接口即可。
以下是一个简单的单机类型任务示例。
Job分组:测试——***-*-*-****Job处理接口:org.springframework.cloud.alibaba.cloud.examples.SimpleTask类型:简单Job单机版定时表达式:默认选项——0****Job描述:无自定义参数:无以上任务类型选择了"简单Job单机版",并且制定了Cron表达式为"0****",这意味着,每过一分钟,任务将会被执行且只执行一次。
以上使用的都是SchedulerX的"测试"区域,主要用于本地调试和测试。
在生产级别,除了上面的group-id和namespace以外,还需要一些额外的配置,如下所示。
server.port=18033#其中cn-test是SchedulerX的测试区域spring.cloud.alicloud.scx.group-id=***spring.cloud.alicloud.edas.namespace=***#当应用运行在EDAS上时,以下配置不需要手动配置。spring.cloud.alicloud.access-key=***spring.cloud.alicloud.secret-key=***#以下配置不是必须的,请参考SchedulerX文档spring.cloud.alicloud.scx.domain-name=***其中group-id与之前的获取方式一样,namespace则是从EDAS控制台左侧"命名空间"列表中获取命名空间ID。
短信服务(ShortMessageService)是阿里云为用户提供的一种通信服务的能力。SpringCloudAliCloudSMS实现了与SMS的简单集成,提供更为简单易用的API,可以基于SpringCloudAlibabaSMS来快速的接入阿里云的SMS服务。
如果要在您的项目中引入SMS,使用groupID为com.alibaba.cloud和artifactID为spring-cloud-starter-alicloud-sms的starter。
SpringCloudAlicloudSMS中的SMSAPI基于阿里云官方SMSSDK,提供具备单个短信发送、多个短信批量发送、短信查询、短信消息(短信回执消息和上行短信消息)类型操作API。
一个简单的使用SMSAPI发送短信的应用如下。
SpringCloudAlicloudSMS封装的API接口为了降低学习的成本,尽量保持和官网提供的API以及Example保持一致。
参考以下的Example,来快速开发一个具有批量短信发送的功能。在Controller中或者新建一个Controler新增如下代码:
参考以下的Example,可以快速开发根据某个指定的号码查询短信历史发送状态。在Controller中或者新建一个Controler新增如下代码:
1、在application.properties配置文件中(也可以是application.yaml)配置SmsReport的队列名称。
application.properties
spring.cloud.alicloud.sms.report-queue-name=Alicom-Queue-********-SmsReport2、实现SmsReportMessageListener接口,并初始化一个SpringBean。
通过订阅SmsUp上行短信消息,可以获知终端用户回复短信的内容。这些工作也已经被SpringCloudAliCloudSMS封装好了。你只需要完成以下两步即可。
spring.cloud.alicloud.sms.up-queue-name=Alicom-Queue-********-SmsUp2、实现SmsUpMessageListener接口,并初始化一个SpringBean。
非SpringCloud应用,统称异构微服务。比如你的遗留项目,或者非JVM应用。
原因有两点:
既然没有,索性自己写了。
我准备了一个NodeJS编写的简单微服务。
示例:
至于断路器,正常为你的SpringCloud微服务整合Sentinel或者Hystirx、Resilience4J即可。
由于AlibabaSidecar基于SpringCloudGateway,而网关自带转发能力。
而SpringCloudGateway是整合了Ribbon的,所以实现了负载均衡;SpringCloudGateway还可以整合Sentinel或者Hystirx、Resilience4J,所以也带有了断路器。
AlibabaSidecar的设计和Sidecar基本一致,优缺点和Sidecar的优缺点也是一样的。
优点:
缺点:
跟JVM编译部署方式相比,GraalVM具有以下特点:
从上述对比可发现,最新支持SpringBoot3.0基于GraalVM的SpringCloudAlibaba应用会在启动速度、运行时内存占用和应用包大小方面得到大幅度降低,例如,其中服务注册消费应用启动速度提升了近10倍,运行时内存占用比原来降低了近乎2/3,效果非常明显。这给云原生时代,托管在云上的应用带来了显著优势,让其可以更快的进行弹性扩缩容以及降低企业整体用云成本!
要使用NativeBuildTools构建原生镜像,需要在首先在机器上安装GraalVM发行版。您可以在LibericaNativeImageKit页面上手动下载它,也可以使用像SDKMAN!这样的下载管理器。本文演示环境为MacOS,如果是Windows可参考相应文档进行操作。执行以下命令安装GraalVM环境:
sdkinstalljava22.3.r17-niksdkusejava22.3.r17-nik通过检查java-version的输出来验证是否配置了正确的版本:
$java-versionopenjdkversion"17.0.5"2022-10-18LTSOpenJDKRuntimeEnvironmentGraalVM22.3.0(build17.0.5+8-LTS)OpenJDK64-BitServerVMGraalVM22.3.0(build17.0.5+8-LTS,mixedmode)13.2.3.生成hint文件通过以下命令生成应用中反射、序列化和动态代理所需的hint配置文件:
mvn-Pnativespring-boot:run之后我们的example应用会启动,我们需要尽可能完整的测试一遍example的所有功能,保证应用的大部分代码都被测试用例覆盖,这样才能确保完整生成应用运行过程中的所有必须的动态属性。运行完所有测试用例后,我们发现resource/META-INF/native-image目录下会生成以下一些hint文件:
以上步骤一切准备就绪后,通过以下命令来构建原生镜像:
mvn-Pnativenative:compile成功执行后,我们在/target目录可以看到我们生成的可执行文件。
与普通可执行文件无异,通过target/nacos-config-2.4.x-example启动本example,可以观察到类似如下的输出:
Physicalfootprint:59.2MPhysicalfootprint(peak):59.2M通过普通的方式启动Java应用的内存占用情况如下:
Physicalfootprint:214.0MPhysicalfootprint(peak):256.8M可以看到,通过原生镜像启动Java应用后,内存占用大大减少。应用启动后各项功能与通过jar启动无异。