首页
统计
关于
Search
1
Sealos3.0离线部署K8s集群
1,086 阅读
2
类的加载
742 阅读
3
Spring Cloud OAuth2.0
726 阅读
4
SpringBoot自动装配原理
691 阅读
5
集合不安全问题
587 阅读
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
登录
Search
标签搜索
Java
CSS
mysql
RabbitMQ
JavaScript
Redis
JVM
Mybatis-Plus
Camunda
多线程
CSS3
Python
Spring Cloud
注解和反射
Activiti
工作流
SpringBoot
Mybatis
Spring
html5
蘇阿細
累计撰写
389
篇文章
累计收到
4
条评论
首页
栏目
笔记
Java
多线程
注解和反射
JVM
JUC
设计模式
Mybatis
Spring
SpringMVC
SpringBoot
MyBatis-Plus
Elastic Search
微服务
Dubbo
Zookeeper
SpringCloud
Nacos
Sentinel
数据库
MySQL
Oracle
PostgreSQL
Redis
MongoDB
工作流
Activiti7
Camunda
消息队列
RabbitMQ
前端
HTML5
CSS
CSS3
JavaScript
jQuery
Vue2
Vue3
Linux
容器
Docker
Kubernetes
Python
FastApi
页面
统计
关于
搜索到
31
篇与
的结果
2021-04-29
Nacos
服务注册和配置中心的组合:Nacos = Eureka + config + bus一、安装1、环境:java8、Mavennacos地址:https://github.com/alibaba/nacos2、启动# 注:单机启动,需修改bin目录下的startup.cmd为`standalone`模式 set MODE="standalone" set FUNCTION_MODE="all" set SERVER=nacos-server set MODE_INDEX=-1 set FUNCTION_MODE_INDEX=-1 set SERVER_INDEX=-1 set EMBEDDED_STORAGE_INDEX=-1 set EMBEDDED_STORAGE=""windows环境下,双击startup.cmd启动3、访问Nacos# nacos默认监听8848 # 默认账号:nacos,密码:nacos localhost:8848二、测试1、payment模块新建cloudalibaba-provider-payment9001、cloudalibaba-provider-payment9002两个模块pom<!-- Nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>ymlserver: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 management: endpoints: web: exposure: include: '*'主启动类@SpringBootApplication @EnableDiscoveryClient public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); } }controller@RestController @RequestMapping("/payment") public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping("/nacos/{id}") public String getPayment(@PathVariable("id")int id){ return "nacos registry, serverPort: " + serverPort + "\t id: " + id; } }2、order模块pom同理paymentymlserver: port: 8088 spring: application: name: nacos-payment-consumer cloud: nacos: discovery: server-addr: localhost:8848 # 消费者将要去访问的微服务名称(注册进nacos的服务提供者) service-url: nacos-user-service: http://nacos-payment-provider主启动类@SpringBootApplication @EnableDiscoveryClient public class ConsumerMain80 { public static void main(String[] args) { SpringApplication.run(ConsumerMain80.class, args); } }config@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }controller@RestController @RequestMapping("/consumer") public class ConsumerController { @Autowired private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping("/payment/nacos/{id}") public String paymentInfo(@PathVariable("id")int id){ return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class); } }
2021年04月29日
110 阅读
0 评论
0 点赞
2021-04-29
Spring Cloud Stream
一、概述 Spring Cloud Stream 是一个构建消息驱动微服务的框架,应用程序通过inputs(生产者)或outputs(消费者)来与Spring Cloud Stream中binder对象交互,binder主要负责与消息中间件交互(开发人员只需操作Stream,而不用关心底层使用的是什么MQ)。注:目前仅支持RabbitMQ和kafka二、如何屏蔽底层差异在没有绑定器这个概念的情况下,SpringBoot应用在直接与消息中间件交互的时候,由于各MQ的设计初衷有不同,细节上存在较大的差异。通过定义绑定器作为中间层,完美的实现了应用程序与消息中间件细节之间的隔离;通过向应用程序暴露统一的channel频道,使得应用程序不需要再考虑各种MQ的实现。Stream对消息中间件的进一步封装,可以做到代码层面对中间件的无感知,甚至于动态的切换中间件(RabbitMQ<==>kafka),使得开发高度解耦,更加专注于自己的业务流程。Spring Cloud Stream处理架构三、通信模式Stream消息通信遵循发布-订阅模式Spring Cloud Stream的业务流程source:发布消息sink:接收消息图片来源:尚硅谷 - 周阳 - Spring Cloud Alibaba四、常用注解和API名称说明Middleware中间件Binder应用与消息中间件之间的封装,目前实现了RabbitMQ和Kafka的Binder,利用Binder可以很方便的连接MQ,可以动态的改变消息类型(RabbitMQ--exchange,Kafaka--topic),可以通过yml文件的配置来实现@Input输入@Output输出@StreamListener监听队列@EnableBinding绑定频道五、测试实例1、提供者pom<!-- stream rabbitmq --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency> <!-- Eureka-client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>ymlserver: port: 8801 spring: application: name: cloud-stream-provider rabbitmq: host: x.x.x.x port: 5672 username: admin password: 123456 cloud: stream: binders: # 配置要绑定的rabbitmq的服务信息 defaultRabbit: # 定义的名称,用于binding整合 type: rabbit # 消息组件类型 bindings: # 服务整合处理 output: # 通道名称 destination: StreamExChange # 交换机的名字 content-type: application/json # 消息类型 binder: defaultRabbit # 设置要绑定的消息服务的具体设置 eureka: client: service-url: defaultZone: http://localhost:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 心跳时间间隔 lease-expiration-duration-in-seconds: 5 # 默认90s instance-id: send-8801.com # 在信息列表显示主机名称 prefer-ip-address: true # 访问路径显示ip 主启动类@SpringBootApplication public class StreamMQMain8801 { public static void main(String[] args) { SpringApplication.run(StreamMQMain8801.class, args); } }Service@EnableBinding(Source.class) //定义消息的推送通道 public class MessageProviderImpl implements MessageProvider { @Autowired private MessageChannel output; @Override public String send() { String serial = UUID.randomUUID().toString(); output.send(MessageBuilder.withPayload(serial).build()); System.out.println("======>" + serial); return null; } }controller@RestController public class SendMessageController { @Autowired private MessageProvider service; @GetMapping("/send") public String sendMessage(){ return service.send(); } }2、消费者==创建8802、8803两个消费者==pom同理消费者ymlserver: port: 8802 spring: application: name: cloud-stream-consumer rabbitmq: host: x.x.x.x port: 5672 username: admin password: 123456 cloud: stream: binders: # 配置要绑定的rabbitmq的服务信息 defaultRabbit: # 定义的名称,用于binding整合 type: rabbit # 消息组件类型 bindings: # 服务整合处理 input: # 通道名称 destination: StreamExChange # 交换机的名字 content-type: application/json # 消息类型 binder: defaultRabbit # 设置要绑定的消息服务的具体设置 group: GroupA8802 eureka: client: service-url: defaultZone: http://localhost:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 心跳时间间隔 lease-expiration-duration-in-seconds: 5 # 默认90s instance-id: recive-8802.com # 在信息列表显示主机名称 prefer-ip-address: true # 访问路径显示ip 启动类@SpringBootApplication public class StreamMQMain8802 { public static void main(String[] args) { SpringApplication.run(StreamMQMain8802.class, args); } }controller@Component @EnableBinding(Sink.class) public class ReciveController { @Value("${server.port}") private String serverPort; @StreamListener(Sink.INPUT) public void input(Message<String> msg){ System.out.println("消费者8802,接收到消息:" + msg.getPayload() + "\t serverPort:" + serverPort); } }六、重复消费的问题启动以上的测试实例,会发现8801生产者发送一条消息,8802、8803都收到了消息如何解决?通过将消费者分组来解决:即将原先GroupA8802、GroupA8803两个分组改为同一个分组GroupA注:在同一个分组中,多个消费者是竞争关系,这样就能保证消息只会被分组中的一个消费者消费server: port: 8802 spring: application: name: cloud-stream-consumer rabbitmq: host: x.x.x.x port: 5672 username: admin password: 123456 cloud: stream: binders: # 配置要绑定的rabbitmq的服务信息 defaultRabbit: # 定义的名称,用于binding整合 type: rabbit # 消息组件类型 bindings: # 服务整合处理 input: # 通道名称 destination: StreamExChange # 交换机的名字 content-type: application/json # 消息类型 binder: defaultRabbit # 设置要绑定的消息服务的具体设置 group: GroupA eureka: client: service-url: defaultZone: http://localhost:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 心跳时间间隔 lease-expiration-duration-in-seconds: 5 # 默认90s instance-id: recive-8802.com # 在信息列表显示主机名称 prefer-ip-address: true # 访问路径显示ip消息持久化问题在分组解决重复消费的问题是,分组同时也实现了消息的持久化
2021年04月29日
52 阅读
0 评论
0 点赞
2021-04-24
Sleuth分布式链路
Spring Cloud Sleuth提供了一套完整的服务跟踪解决方案,并且兼容支持zipkinTrace Id链路关系图片来源:尚硅谷-周阳 Spring CLoud AlibabaTrace:类似于树结构的span集合,表示一条调用链路,存在唯一标识span:表示调用链路来源(也就是一次请求信息)测试
2021年04月24日
38 阅读
0 评论
0 点赞
2021-04-24
Bus消息总线
一、概述在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线.二、基本原理ConfigClient实例都监听MQ中同一个topic(默认Spring Cloud Bus),当一个服务刷新数据的时候,它会把这个消息放到topic中,这样其他监听同一个topic的服务就能收到通知,然后去更新自身的配置。三、流程四、手动定点刷新curl -X POSt "http://localhost:3344/actuator/bus-refresh/config-client:3355"五、通过分组解决消息重复消费的问题图片来源:尚硅谷-周阳 Spring CLoud Alibaba注:通过分组解决消息重复消费的同时,也实现了消息持久化
2021年04月24日
51 阅读
0 评论
0 点赞
2021-04-23
Gateway
一、概述Spring Cloud GateWay作为Spring Cloud生态系统中的网关,目的是代替zuul。其基于WebFlux框架,底层使用高性能的Reactor模式的通信框架Netty。提供统一的路由方式且基于Filter链的方式提供网关的基本功能,如:安全、监控/指标、限流等。二、特性1、基于Spring Framework 5,Project Reactor,SpringBoot 2.0进行构建2、动态路由:能够匹配任何请求属性3、可以对路由指定Predicates(断言)和Filter(过滤器)4、集成Hystrix的断路器功能5、集成SpringCloud服务发现功能6、请求限流7、路径重写……三、三个概念1、Route(路由)路由是构建网关的基本模块,由ID、目标URI和一系列的断言、过滤器组成,如果断言为true则匹配该路由2、Predicates(断言)匹配Http请求中的所有内容(请求头或请求参数等)3、Filter(过滤)指Spring框架中GatewayFilter的实例,使用过滤时,可以在请求被路由之前或之后对请求做出修改四、工作流程客户端向Spring Cloud GateWay发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler;Handler再通过指定的过滤器链将请求发送到实际的执行业务逻辑,然后返回(过滤器可能会在发送代理请求之前(pre)或之后(post)执行业务逻辑);Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;在“post”类型的过滤器可以做内容响应、响应头的修改,日志的输出、流量监控等功能Predicates cookies路由规则HeaderHostMethodQuery图片来源:尚硅谷-周阳 Spring CLoud Alibaba
2021年04月23日
44 阅读
0 评论
0 点赞
2021-01-01
Spring Cloud Config分布式配置中心
Spring Cloud ConfigSpring Cloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。Spring Cloud Config分为客户端和服务端:服务端:分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器,并为客户端提供获取配置信息,加密,解密信息等访问接口客户端:通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样有助于对环境配置进行版本管理。作用:集中管理配置文件不同环境,不同配置,动态化的配置更新,分环境部署,如:开发、测试、生产等环境运行期间可以动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息当配置发生变动时,服务节点不需要重启,动态应用新的配置配置信息以REST接口的形式暴露图片来源:狂神说Java具体实例1、服务端pom依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.1.1.RELEASE</version> </dependency> <!--actuator监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>application.yml配置:server: port: 3344 spring: application: name: springcloud-config-server #连接远程仓库 cloud: config: server: git: uri: https://github.com/suaxi/SpringCloud-config.gitSpringBoot启动类开启ConfigServer注解:package com.sw.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; /** * @Author suaxi * @Date 2020/12/30 14:49 */ @SpringBootApplication @EnableConfigServer public class Config_Server_3344 { public static void main(String[] args) { SpringApplication.run(Config_Server_3344.class,args); } } 2、客户端pom依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> <!--actuator监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>bootstrap.yml配置:#系统级别的配置 spring: cloud: config: name: config-client #需要从远程仓库读取的资源名称 profile: dev #版本 label: master #分支 uri: http://localhost:3344 #获取配置信息的地址(Config配置服务端)application.yml配置:#用户级别的配置 spring: application: name: springcloud-config-client-3355Controller(配置REST接口)package com.sw.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author suaxi * @Date 2020/12/30 15:29 */ @RestController public class ConfigClientController { @Value("${spring.application.name}") private String applicationName; @Value("${eureka.client.service-url.defaultZone}") private String eurekaServer; @Value("${server.port}") private String port; @RequestMapping("/config") public String getConfig(){ return "applicationName:"+applicationName+ "eurekaServer:"+eurekaServer+ "port:"+port; } } 3、Eureka服务注册中心pom依赖:<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies>bootstrap.yml配置:与config配置中心的客户端一致,都是从Config服务端获取配置信息spring: cloud: config: name: config-eureka label: master profile: dev uri: http://localhost:3344application.yml配置:spring: application: name: springcloud-config-eureka-7001SpringBoot启动类:package com.sw.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * @Author suaxi * @Date 2020/12/29 11:02 */ @SpringBootApplication @EnableEurekaServer //服务端 public class EurekaConfigServer_7001 { public static void main(String[] args) { SpringApplication.run(EurekaConfigServer_7001.class,args); } } 4、Eureka服务提供者pom依赖:<dependencies> <!--需要拿到实体类,配置api module--> <dependency> <groupId>com.sw</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--actuator监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies>bootstrap.yml配置:与以上两个的配置一致,都是从Config服务端获取配置信息spring: cloud: config: name: config-dept label: master profile: dev uri: http://localhost:3344application.yml配置:spring: application: name: springcloud-config-dept-8088服务提供者对比之前的配置(application.yml):通过Config分布式配置中心,将配置文件放到git统一管理,现只需从Config-server获取即可server: port: 8088 #mybatis配置 mybatis: type-aliases-package: com.sw.springcloud.pojo config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml #Spring配置 spring: application: name: springcloud-provider-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db01?useUnicode=true&character=UFT-8 username: root password: 123456 #配置Eureka,配置服务注册到哪里 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: springcloud-provider_dept8088 #修改Eureka默认描述信息 prefer-ip-address: true #显示服务的真实ip地址,替换原先的localhost #info配置 info: app.name: springcloud-demo company.name: suaxi 配置文件交由git统一管理
2021年01月01日
80 阅读
0 评论
0 点赞
2020-12-31
Zuul路由网关
Zuul路由网关Zuul包含对请求的路由和过滤两个功能:路由功能:负责将外部请求转发到具体的微服务实例上,实现外部访问入口统一过滤:对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础注:Zuul服务也会注册到Eureka服务注册中心1、导入依赖<dependencies> <!--zuul--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--hystrix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> <version>1.4.7.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--Ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--Eureka--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> <dependency> <groupId>com.sw</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>2、application.yml配置server: port: 8888 spring: application: name: springcloud-zuul eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: zuul8888.com prefer-ip-address: true info: app.name: springcloud-demo company.name: suaxi zuul: routes: mydept.serviceID: springcloud-provider-dept mydept.path: /mydept/** ignored-services: "*" #ignored-services: springcloud-provider-dept禁止使用原来的微服务名访问 #设置为 * 表示禁止使用全部的微服务ID进行访问3、SpringBoot启动类开启Zuul注解一般使用@EnableZuulProxypackage com.sw.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; /** * @Author suaxi * @Date 2020/12/30 10:50 */ @SpringBootApplication @EnableZuulProxy //开启Zuul路由网关 public class ZuulApplication_8888 { public static void main(String[] args) { SpringApplication.run(ZuulApplication_8888.class,args); //http://www.xxx.com:8888/mydept/dept/get/1 } } 开启Zuul路由网关后,可通过:域名+端口号 访问微服务项目
2020年12月31日
93 阅读
0 评论
0 点赞
2020-12-31
Hystrix服务降级
Hystrix服务降级A、B、C三台服务器,A在某一时间段的负载很重,急需扩容,而此时间段B、C负载很小或没有访问量,需关闭其中的服务器,拿去给A扩容,以降低负载,同时设置fallback回调,让这个时间段需要访问B、C服务器的用户得到“服务暂时不可用或关闭”的信息,这个过程可以简单的比喻为服务降级。1、API接口设置fallback回调pojopackage com.sw.springcloud.pojo; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.io.Serializable; /** * @Author suaxi * @Date 2020/12/28 21:07 */ @Data @NoArgsConstructor @Accessors(chain = true) //链式编程 public class Dept implements Serializable { private Long deptno; private String dname; private String db_source; //数据存在哪个数据库 public Dept(String dname) { this.dname = dname; } } service接口package com.sw.springcloud.service; import com.sw.springcloud.pojo.Dept; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; /** * @Author suaxi * @Date 2020/12/29 20:02 */ @Component @FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class) public interface DeptClientService { @GetMapping("/dept/get/{id}") public Dept findById(@PathVariable("id")Long id); @GetMapping("/dept/list") public List<Dept> findAll(); @PostMapping("/dept/add") public boolean addDept(Dept dept); } FallbackFactoryService服务降级设置package com.sw.springcloud.service; import com.sw.springcloud.pojo.Dept; import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; /** * @Author suaxi * @Date 2020/12/30 9:33 * 服务降级 */ @Component public class DeptClientServiceFallbackFactory implements FallbackFactory { @Override public Object create(Throwable throwable) { return new DeptClientService() { @Override public Dept findById(Long id) { return new Dept() .setDeptno(id) .setDname("未查询到数据,该服务现已被关闭") .setDb_source("没有数据库信息"); } @Override public List<Dept> findAll() { return null; } @Override public boolean addDept(Dept dept) { return false; } }; } /* 服务熔断:服务端,某个服务超时或异常,引起熔断(类似于保险丝) 服务降级:客户端,从系统整体负载考虑,当某个服务熔断或关闭之后,服务将不再被调用 此时在客户端可以设置一个回调FallbackFactory,返回一个默认的缺省值,可以 提升用户体验,但服务质量随之下降 */ } 2、消费者端设置appliction.yml配置服务降级server: port: 80 eureka: client: register-with-eureka: false #不向注册中心注册自己(消费者端) service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #开启降级feign.hystrix feign: hystrix: enabled: true将RestTemplate注册到Spring容器中package com.sw.springcloud.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; /** * @Author suaxi * @Date 2020/12/28 22:15 */ @Configuration public class ConfigBean { @Bean @LoadBalanced //注册Ribbon public RestTemplate getRestTemplate(){ return new RestTemplate(); } } SpringBoot启动类package com.sw.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; /** * @Author suaxi * @Date 2020/12/28 22:29 */ @SpringBootApplication @EnableEurekaClient @EnableFeignClients(basePackages = {"com.sw.springcloud"}) public class FeignDeptConsumer_80 { public static void main(String[] args) { SpringApplication.run(FeignDeptConsumer_80.class,args); } } 用户正常访问服务:微服务节点出现问题,服务降级:
2020年12月31日
142 阅读
0 评论
0 点赞
1
2
3
4