SOA:Service Oriented Architecture 面向服务的架构,其中包含多个功能,服务之间通过相互依赖最终提供一些列的功能,一个功能,一个服务,各个服务之间通过网络调用。
微服务:将⼀个⼤的单体应⽤进⾏细粒度的服务化拆分,每个拆分出来的服务各⾃独⽴打包部署,各个服务之间 通过⽹络调⽤。
优点:
缺点:
(1)版本说明
(2)创建父工程项目ali-cloud,删除src目录
<packaging>pompackaging>
<properties>
<java.version>1.8java.version>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.boot.version>2.3.3.RELEASEspring.boot.version>
<spring.cloud.version>Hoxton.SR8spring.cloud.version>
<alibaba.cloud.version>2.2.1.RELEASEalibaba.cloud.version>
<mybatisplus.boot.starter.version>3.4.0mybatisplus.boot.starter.version>
<lombok.version>1.18.16lombok.version>
<commons.lang3.version>3.9commons.lang3.version>
<commons.codec.version>1.15commons.codec.version>
<springfox.boot.starter.version>3.0.0springfox.boot.starter.version>
<docker.image.prefix>xdclass-clouddocker.image.prefix>
<skipTests>trueskipTests>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring.boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${alibaba.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>${mybatisplus.boot.starter.version}version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>${lombok.version}version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
<version>${springfox.boot.starter.version}version>
dependency>
dependencies>
dependencyManagement>
<repositories>
<repository>
<id>maven-aliid>
<url>http://maven.aliyun.com/nexus/content/groups/public//url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
<updatePolicy>alwaysupdatePolicy>
<checksumPolicy>failchecksumPolicy>
snapshots>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>publicid>
<name>aliyun nexusname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
pluginRepository>
pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>${spring.boot.version}version>
<configuration>
<fork>truefork>
<addResources>trueaddResources>
configuration>
plugin>
plugins>
build>
(3)父工程下创建常量类
<dependencies>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.4.1version>
dependency>
<dependency>
<groupId>org.apache.velocitygroupId>
<artifactId>velocity-engine-coreartifactId>
<version>2.0version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
dependency>
dependencies>
(4)创建order-service、video-service、user-service
<dependencies>
<dependency>
<groupId>net.xdclass</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
(1)分别在order-service、user-service、video-service的yml文件中加入mybatis配置
server:
port: 8001 #(端口号)
spring:
application:
name: user-service #(服务名称)
#数据库配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.10.88:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai #(配置数据库地址)
username: root
password: 123456
#配置plus打印sql日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
(2)测试Mybatis
@Service
public class VideoServiceImpl implements VideoService {
@Autowired
private VideoMapper videoMapper;
@Override
public Video findById(int id) {
return videoMapper.findById(id);
}
}
public interface VideoMapper {
@Select("select * from video where id = #{id}")
Video findById(int id);
}
@RestController
@RequestMapping("/api/v1/video")
public class VideoController {
@Autowired
private VideoService videoService;
@GetMapping("/find_video/{video_id}")
public JsonData findVideo(@PathVariable("video_id") int id){
System.out.println(id);
Video video = videoService.findById(id);
return JsonData.buildSuccess(video);
}
}
(1)订单微服务主类注入RestTemplate
@SpringBootApplication
@MapperScan("net.xdclass.mapper")
public class OrderApplication {
public static void main(String[] args){
SpringApplication.run(OrderApplication.class);
}
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
(2)Controller中调用
@RestController
@RequestMapping("/api/v1/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/save/{video_id}")
public JsonData save(@PathVariable("video_id") int id){
Video video = restTemplate.getForObject("http://localhost:7001/api/v1/video/find_video/" + id, Video.class);
System.out.println("video:"+video);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setCreateTime(new Date());
videoOrder.setVideoImg(video.getCoverImg());
videoOrder.setVideoImg(video.getCoverImg());
videoOrder.setVideoTitle(video.getTitle());
return JsonData.buildSuccess(videoOrder);
}
}
(1)什么是注册中心
服务注册:服务提供者provider,启动的时候想注册中心上报自己的网络信息.
服务发现:服务消费者consumer,启动的时候想注册中心上报自己的网络信息,拉取provider的相关网络信息.
核心:服务管理,注册中心有个注册表,心跳机制动态维护,服务实例在启动时注册到服务表,关闭时注销.
(2)为什么要用
微服务应用和机器越来越多,调用方需要知道接口的网络地址,如果靠配置文件的方式去控制网络地址,对于动态新增机器,维护带来很大问题,主流的注册中心:zookeeper、Eureka、consul、etcd、Nacos。
(3)nacos的特性
(1)安装部署Nacos
#上传Nacos压缩包到服务器,解压
unzip nacos-server-1.3.2.zip
#配置jdk、maven环境,解压jdk、maven安装包
#jdk
JAVA_HOME=/usr/local/jdk8
export JAVA_HOME
CLASSPATH=.:$JAVA_HOME/lib
export CLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$CLASSPATH
export PATH
#maven
MAVEN_HOME=/usr/local/maven
export MAVEN_HOME
PATH=$PATH:$MAVEN_HOME/bin
export PATH
(2)启动Nacos
cd /usr/local/nacos/bin
./startup.sh
#启动后会发现启动不成功,因为nacos默认是以集群方式启动的,要修改启动方式
#需修改配置文件
export MODE="standalone"
(3)开放防火墙端口,nacos默认端口8848,重启防火墙
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --reload
(4)Nacos访问页面,默认账号密码为nacos
(1)yml文件中配置服务注册
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.10.88:8848 #nacos地址
(2)主类配置@EnableDiscoveryClient注解
@EnableDiscoveryClient
(3)验证服务注册
@RestController
@RequestMapping("/api/v1/order")
public class OrderController {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/save/{video_id}")
public JsonData save(@PathVariable("video_id") int id){
// Video video = restTemplate.getForObject("http://localhost:7001/api/v1/video/find_video/" + id, Video.class);
//list获取服务的元数据信息,包括IP,端口,服务名称等等
List<ServiceInstance> list = discoveryClient.getInstances("video-service");
ServiceInstance serviceInstance = list.get(0);
Video video = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+
"/api/v1/video/find_video?id="+id,Video.class);
System.out.println("video:"+video);
VideoOrder videoOrder = new VideoOrder();
videoOrder.setCreateTime(new Date());
videoOrder.setVideoImg(video.getCoverImg());
videoOrder.setVideoImg(video.getCoverImg());
videoOrder.setVideoTitle(video.getTitle());
return JsonData.buildSuccess(videoOrder);
}
Ribbon是⼀个客户端负载均衡⼯具,通过Spring Cloud封装,可以轻松和AlibabaCloud整合。
订单微服务开启Ribbon,添加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate restTemplate() { return new RestTemplate();}
controller中要修改成服务名称调用,ribbon是根据服务名称调用的
(1)大体流程
(2)Ribbon的作用主要在于第二步选择节点
点进LoadBalancerClient的实现类RibbonLoadBalancerClient,只有这一个实现类
(3)RibbonLoadBalancerClient继承体系
(1)Ribbon支持的负载均衡策略
策略类 | 命名 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择Server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(默认) |
RetryRule | 重试策略 | 当选择server不成功,短期内尝试选择一个可用的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤一直失败并被标记为circuit tripped的server,过滤掉那些高并发连接的server |
WeightedResponseTimeRule | 响应时间加权重策略 | 根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越⼤,综合了各种因素,⽐如:⽹络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合所在区域的性能,和server的可用性,轮询选择server |
(2)配置yml
#使用随机负载均衡策略
video-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
(3)测试、分别启动三个VideoServer:9001、9006、9007
策略选择:
(1)common项目加入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
(2)主类配置注解@EnableFeignClients
@EnableFeignClients
(3)编写Fegin的service接口
@EnableFeignClient(name="video-service")
public interface VideoFeginService{
@GetMapping("/api/v1/video/find_by_id")
JsonData findById(@RequestParam("id") int id)
}
(4)Post方式调用
@PostMapping("/api/v1/video/save")
JsonData save(@RequestBody Video video);
Feign默认集成了ribbon
写起来更加思路清晰和方便
采用注解方式进行配置,配置熔断等方式方便
CAP定理:指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡
CA: 如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的
CP: 如果不要求A(可用),每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统
AP:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性
常见的注册中心:zk、eureka、nacos
Naocs | Eureka | Consul | Zookeeper | |
---|---|---|---|---|
一致性协议 | CP+CA | AP | CP | CP |
健康检查 | TCP/HTTP/MYSQL/ClientBeat | 心跳 | TCP/HTTP/gRPC/Cmd | Keep Alive |
雪崩保护 | 有 | 有 | 无 | 无 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | TCP |
SpringCloud集成 | 支持 | 支持 | 支持 | 支持 |
什么是base理论
CAP中的一致性和可用性进行一个权衡的结果,核心思想就是:我们无法做强一致,但每个应用都可以根据自身的业务特点,采取响应的方式来是系统达到最终的一直性,来自ebay的架构师提出。
微服务拆分多个系统,服务之间相互依赖,可能会由于系统负载过高,突发流量或者网络等各种异常情况导致服务不可用。
(1)什么是Sentinel
(2)核心概念
(1)Sentinel分为两个部分
(2)微服务引入Sentinel依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
(3)微服务yml中引入Sentinel
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 9999
#dashboard: ip:8080 控制台访问地址
#port: 9999 本地启的端口,随机算哪个不能被占用的,会在应⽤对应的机器上启动⼀个 Http Server,该 Server 会与 Sentinel 控制台做交互, 若被占⽤,则开始+1⼀次扫描
(4)启动sentinel的jar包,控制台访问,默认的账号密码都是sentinel
java -jar dashboard-1.8.0.jar
注意:微服务注册上去后,由于Sentinel是懒加载模式,所以需要访问微服务后才会在控制台出现
(1)流量控制(flow control)
原理是监控应用流量的QPS或者并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
(2)两种规则
并发数控制用于保护业务线程池不被满调用耗尽
Sentinel并发控制不负责创建和管理线程池,而是简单统计当前请求上下文的线程数目(正在执行的调用数目)
如果超出阈值,新的请求会被立即拒绝,效果类似于信号隔离。
当QPS超过某个阈值的时候,则采取措施进行流量控制
(1)直接拒绝
(2)Warm up
(3)匀速排队
(1)熔断降级
(2)Sentinel熔断降级策略
(1)Sentinel⾃定义异常简介
(2)AlibabCloud版本升级,不兼容问题
/*旧版实现UrlBlockHandler并且重写blocked方法*/
@Component
public class MyUrlBlockHandler implements UrlBlockHandler {
@Override public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws IOException { //降级业务处理 }
}
/*旧版实现BlockExceptionHandler并且重写blocked方法*/
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
@Override public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e) throws Exception { //降级业务处理 }
}
(3)Sentinel自定义异常类
FlowException //限流异常
DegradeException //降级异常
ParamFlowException //参数限流异常
SystemBlockException //系统负载异常
AuthorityException //授权异常
@Component
public class XdBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
Map<String,Object> backMap = new HashMap<>();
if(e instanceof FlowException){
backMap.put("code",-1);
backMap.put("msg","限流异常");
}else if (e instanceof DegradeException){
backMap.put("code",-2);
backMap.put("msg","熔断异常");
}else if (e instanceof ParamFlowException){
backMap.put("code",-3);
backMap.put("msg","热点异常");
}else if (e instanceof SystemBlockException){
backMap.put("code",-4);
backMap.put("msg","系统规则异常");
}else if (e instanceof AuthorityException){
backMap.put("code",-5);
backMap.put("msg","认证异常");
}
//设置返回json数据
response.setStatus(200);
response.setHeader("content-Type","application/json;charset=UTF-8");
response.getWriter().write(JSON.toJSONString(backMap));
}
}
(4)案例测试
(1)加入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
dependency>
(2)开启Feign对Sentinel的支持
feign:
sentinel:
enabled: true
(3)创建容错类,实现对应的服务接口,记得加注解
@Service
public class VideoServiceFallback implements VideoService {
@Override
public JsonData findVideo(int id) {
Video video = new Video();
video.setTitle("熔断降级数据");
return null;
}
@Override
public JsonData save(Video video) {
return null;
}
}
(4)配置feign容错类
@FeignClient(value = "xdclass-video-service", fallback = VideoServiceFallback.class)
(1)什么是网关
API Gateway,是系统的唯一对外的入口,介于客户端和服务端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能
(2)统一接入
(3)流量控制
(4)安全防护
(5)主流的网关
(1)先添加网关的依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
(2)配置启动类
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args){
SpringApplication.run(GatewayApplication.class);
}
}
(3)配置yml文件
server:
port: 8888
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: video-service #唯一标识
uri: http://127.0.0.1:9001 #转发服务的地址端口
order: 1 #优先级,1表示最大
predicates: #断言,配置那个路径才转发
- Path=/video-server/**
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #1表示过滤掉第一层前缀
(4)效果演示
(1)添加nacos依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
(2)启动类开启支持
@EnableDiscoveryClient
(3)修改配置文件
server:
port: 8888
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: video-service
uri: lb://video-service #注意这块要写nacos中注册的服务名,lb://服务名
order: 1
predicates:
- Path=/video-server/**
filters:
- StripPrefix=1
discovery:
locator:
enabled: true #开启网关拉取nacos服务
nacos:
discovery:
server-addr: 192.168.10.88:8848 #配置nacos地址
(4)效果演示
(1)什么是Gateway路由断言
predicates:
- Host=
- Path=
- Method=
- Header=
- Query=
- Cookie=
#需求:接口需要在指定时间进行下线,过后不可以在被访问
#使用Before,只有当时时间小于设定时间,路由才会匹配请求
#格式:
predicates:
- Before=2020-09-09T01:01:01.000+08:00
- Query=source
(1)代码编写
@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//写业务逻辑
String token = exchange.getRequest().getHeaders().getFirst("token");
if(StringUtils.isBlank(token)){
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
//否则就继续往下执行
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
(2)测试
(1)微服务中常见的问题
(2)链路追踪系统
分布式应用架构虽然满足了应用横向扩展的需求,但是运维和诊断的过程变得越来越复杂,例如会遇到接口诊断困难、应用性能诊断复杂、架构分析复杂等难题,传统的监控工具并无法满足,分布式链路系统由此诞生
核心:将一次请求分布式调用,使用GPS定位穿起来,记录每个调用的耗时、性能等日志,并通过可视化工具展示出来。
注意:AlibabaCloud全家桶还没对应的链路追踪系统,我们使用Sleuth和zipkin(内部使用的鹰眼)
(1)什么是Sleuth
(2)微服务项目添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
(3)日志各个字段含义
#示例:[order-service,96f95a0dd81fe3ab,852ef4cfcdecabf3,false]
第一个:服务名称,spring.application.name
第二个:trace id,整个服务调用链路只用这一个trace id
第三个:span id,标记每个微服务的唯一标识,基本工作单元
第四个:是否要将该信息输出到zipkin服务中收集和展示
(1)什么是zipkin
大规模分布式系统的APM工具(Application Performance Management),基于Google Dapper的基础实现,和sleuth结合可以提供可视化web界面分析调用链路耗时情况
(2)同类产品
(3)zipkin启动
java -jar zipkin-server-2.12.9-exec.jar
(4)zipkin组成:Collector、Storage、Restful API、Web UI组成
(1)微服务项目添加依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
(2)配置zikpin地址和采样百分比配置
spring:
application:
name: api-gateway
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin地址
discovery-client-enabled: false #不用开启服务发现
sleuth:
sampler:
probability: 1.0 #采样百分比
默认为0.1,即10%,这里配置1,是记录全部的sleuth信息,是为了收集到更多的数据(仅供测试用)。
在分布式系统中,过于频繁的采样会影响系统性能,所以这里配置需要采用一个合适的值。
(1)存在的问题
(2)配置mysql持久化
nohup java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin_log --MYSQL_USER=root --MYSQL_PASS=xdclass.net &
(1)现在微服务存在的问题
(2)什么是配置中心
统一管理配置,快速切换各个环境的配置
相关产品
(1)添加项目依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>dependency>
(2)配置bootstrap.yml配置文件
spring:
application:
name: order-service
cloud:
nacos:
config:
server-addr: 192.168.10.88:8848 #Nacos配置中心地址
file-extension: yaml #文件扩展格式
profiles:
active: dev
(3)nacos控制台配置
(4)Data Id组成结构
${prefix}-${spring.profiles.active}.${file-extension}
prefix:默认为spring.application.name的值
spring.profiles.active:即为当前环境对应的profile如果当前的spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变为${prefix}.${file-extension}
file-exetension:配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。⽬前只⽀持 properties 和 yaml 类型。
(5)测试配置是否生效
访问网址:http://192.168.10.88:8848/nacos/#/newconfig?serverId=center&namespace=&edasAppName=&edasAppId=&searchDataId=&searchGroup=
启动微服务
(1)什么是动态刷新配置
(2)添加属性值url
(3)controller增加@RefreshScope
(1)进入到nacos安装目录下的conf将脚本在mysql中执行
(2)配置nacos的配置文件
(3)重启nacos
/usr/local/nacos/bin/startup.sh
(4)测试效果
(1)准备三台机器,分别部署nacos
192.168.10.90:8848
192.168.10.91:8848
192.168.10.92:8848
(2)编写cluster.conf配置文件
#编写内容,三台机器分别编写
192.168.10.90:8848
192.168.10.91:8848
192.168.10.92:8848
(3)配置mysql持久化
#三天机器分别配置
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.10.88:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
(4)访问nacos可以三台集群节点
(1)父工程确定版本
<properties>
<java.version>1.8java.version>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.boot.version>2.3.3.RELEASEspring.boot.version>
properties>
(2)每个项目添加镜像打包前缀
<docker.image.prefix>docker-clouddocker.image.prefix>
(3)每个项目添加打包配置
<build>
<finalName>alibaba-cloud-gatewayfinalName>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<fork>truefork>
<addResources>trueaddResources>
configuration>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>dockerfile-maven-pluginartifactId>
<version>1.4.10version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jarJAR_FILE>
buildArgs>
configuration>
plugin>
plugins>
build>
(1)编写DockerFile文件,注意一定要命名成dockerfile
FROM adoptopenjdk/openjdk11:jre11u-nightly
COPY target/打包后的jar名 打包后的jar名
ENTRYPOINT ["java","-jar","/打包后的jar名"]
(2)执行打包命令
mvn install -Dmaven.test.skip=true dockerfile:build
(3)启动容器
docker run 镜像ID -p 指定端口
(4)查看容器日志
docker logs -f 容器ID