学习自
尚硅谷
:学习地址欢迎━(`∀´)ノ亻!大家去一键三连 周阳老师讲的真的很好!!!!!!!🤣🤣🤣
[toc]
SpringCloud alibaba
服务限流降级
:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现
:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理
:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力
:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
阿里云对象存储
:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度
:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
Nacos
挑明说吧:Nacos = Config + Eruka
(Nacos支持 AP + CP )
单机下载安装运行Nacos
玩就玩最新的: 最新的点我下载 (2.0.3目前)
-
Linux 下载tar.gz
-
本机需要有jdk8环境 并且配置好了环境变量
-
导入一下Nacos自带的mysql数据库
-
导入完成后去
application.properties
去配置属性(提一嘴 这个应该是SpringBoot项目的主配置文件) -
配置端口和你刚刚的数据库
-
切换到Nacos的
bin
目录 单机启动命令:sh startup.sh -m standalone
-
默认访问地址:
http:/ip:8848/nacos
需放行8848端口 (8848钛金手机~🤣🤣🤣)
看看运行效果图:
默认账号密码: nacos
nacos
搭建好啦~
消费端和服务端分别注册进 Nacos
消费端
-
导入依赖:
父pom中设置版本号
:<!--spring cloud alibaba 2.1.0.RELEASE--> <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>
子包pom
:<!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
yaml 配置 注册中心地址:
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: # 你的服务器地址:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
-
配置负载均衡
ApplicationContextConfig.java
package com.atguigu.springcloud.alibaba.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
-
主测试Controller
package com.atguigu.springcloud.alibaba.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController @Slf4j public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") //这里是配置文件yaml的属性 private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } }
服务端
服务端与消费端区别不大
唯一区别可能在yaml配置
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: #配置Nacos地址
# 暴露监控端口
management:
endpoints:
web:
exposure:
include: '*'
## 这里没有指向 表示即服务提供者
服务端Controller
package com.atguigu.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
好了 我们运行运行玩一玩
首先偷一张官网的图
基本流程就是上图了 我们来测试一下
服务端自我调用一下
:
现在客户端调用一下服务端
调用成功:(服务列表中显示 客户端服务端都被注册进来了)
Nacos作为服务配置中心
食用步骤—基础配置
-
导入pom.xml
<!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
创建
bootstrap
和application
.yml
application.yml
spring:
profiles:
active: dev # 表示开发环境
#active: test # 表示测试环境
#active: info
bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: #Nacos服务注册中心地址
config:
server-addr: #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
# group: DEV_GROUP
# namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml
# nacos-config-client-test.yaml ----> config.info
-
主启动类
package com.atguigu.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }
-
自动刷新配置: 通过SpringCloud原生注解
@RefreshScope
实现Nacos的动态刷新Controller
package com.atguigu.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @auther zzyy * @create 2020-02-23 17:02 */ @RestController @RefreshScope //支持Nacos的动态刷新功能。 public class ConfigClientController { @Value("${hello}") private String configInfo; @GetMapping("/hello") public String getConfigInfo() { return configInfo; } }
-
在Nacos注册中心面板上新建一个名为:
nacos-config-client-dev.yml
的配置文件 -
试试吧!跑起来看看效果
-
支持动态刷新
食用步骤—分类配置
-
问题引出
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…
那怎么对这些微服务配置进行管理呢?
-
默认三层定位唯一的配置文件:
NameSpace + Group + DataID
从大到小 -
默认情况:
Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
三种分层方案大家可自行尝试~ 下一篇Nacos集群见😉😉