当前位置: 首页 > news >正文

二手物品交换网站建设制作个人网站的软件

二手物品交换网站建设,制作个人网站的软件,企业宣传片制作价格,wordpress主页不显示文章目录 前言springCloud-2021.0.9 之 服务调服务 示例1. 主要用到的组件2. 效果3. 源码3.1. 服务A3.2. 服务B接受接口 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每…

文章目录

  • 前言
    • springCloud-2021.0.9 之 服务调服务 示例
      • 1. 主要用到的组件
      • 2. 效果
      • 3. 源码
        • 3.1. 服务A
        • 3.2. 服务B接受接口

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


springCloud-2021.0.9 之 服务调服务 示例

这里我介绍一下,我用到的springCloud 是2021.0.9版本。
Maven 依赖管理配置引入 Spring Cloud 的 BOM(Bill of Materials)文件,主要作用如下:

  • 版本统一:通过引入 BOM 文件,您可以统一管理项目中所有 Spring Cloud 相关依赖的版本,避免版本冲突和不一致。

  • 简化依赖声明:在子模块中,您无需显式指定 Spring Cloud 相关依赖的版本号,Maven 会自动从 BOM 中获取版本信息。

与以前的引入方式相比,这种方法提供了更好的版本控制和依赖管理,特别是在处理多个子模块和复杂的依赖关系时,能够有效减少手动管理版本的复杂性。

1. 主要用到的组件

Spring Cloud OpenFeign:
这是一个声明式的 REST 客户端,使得调用其他服务的 REST API 变得非常简单。通过 @FeignClient 注解,可以方便地定义 HTTP 接口,自动实现与其他服务的调用。Fein 配合 Ribbon(负载均衡)使用时,可以轻松实现跨服务的调用。

Spring Cloud Eureka:
Eureka 是一个服务注册与发现组件。服务启动时会向 Eureka Server 注册自己,而需要访问其他服务时,可以通过 Eureka 来查找服务的实例。Eureka 可以帮助实现服务的动态发现和负载均衡。

Spring Cloud Circuit Breaker:
统一的熔断器框架,它允许你更方便地实现和管理服务调用中的容错机制。熔断器的核心功能是:当某个服务出现故障(例如超时、异常)时,熔断器会短时间内停止对该服务的调用,从而防止服务间的连锁故障,允许系统在一定程度上继续运行。

Spring Cloud LoadBalancer:
是 Spring Cloud 中的一个客户端负载均衡器,它提供了一种新的方式来替代 Ribbon,用于在服务间调用时实现负载均衡。它的目标是让负载均衡的实现更加简单,灵活并且易于与 Spring Cloud 的其他组件集成。

2. 效果

### 2. 执行效果

测试链路,从postmain 发起 调用到 GateWay 后调到 服务A 然后通过open-Feign 到服务B,下面是我准备的三个服务:

在这里插入图片描述
网关:SPRINGCLOUD-GATEWAY
服务A:SPRINGCLOUDSERVICEA
服务B:SPRINGCLOUDSERVICEB

发起请求:
http://127.0.0.1:8809/springCloudServiceA/api/test/weifuw/xxx


返回:

{"success": true,"code": "0","message": "操作成功!","data": "路径 xxx!"
}

查看zipkin:

在这里插入图片描述
调取网关的接口:
在这里插入图片描述

调取服务A的接口:

在这里插入图片描述

调取服务B的接口:

3. 源码

3.1. 服务A

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.15</version></parent><groupId>org.example</groupId><artifactId>springCloud-service-A</artifactId><version>1.0-SNAPSHOT</version><name>springCloud-service-A</name><properties><java.version>1.8</java.version><spring-cloud.version>2021.0.9</spring-cloud.version><mybatis.version>2.1.3</mybatis.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 添加 Spring Cloud Resilience4j BOM --><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-bom</artifactId><version>1.7.0</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--健康检查--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 热部署模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> <!-- 这个需要为 true 热部署才有效 --></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--多数据源--><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.22</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!--feign 远程调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--注册中心客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--日志追踪--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId></dependency><!-- Spring Cloud Circuit Breaker 和 Spring Cloud LoadBalancer 来替代 Hystrix 和 Ribbon start --><!-- Spring Cloud LoadBalancer --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!-- Spring Cloud Circuit Breaker with Resilience4j --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId></dependency><dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring</artifactId></dependency><!-- Spring Cloud Circuit Breaker 和 Spring Cloud LoadBalancer 来替代 Hystrix 和 Ribbon end --><!-- 整合 mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.3.4.Final</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--springfox start --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version></dependency><!--springfox end --><!-- 密码加密 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.4</version></dependency><!-- flyway -->
<!--        <dependency>-->
<!--            <groupId>org.flywaydb</groupId>-->
<!--            <artifactId>flyway-core</artifactId>-->
<!--            <version>5.2.3</version>-->
<!--        </dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.6.15</version><executions><execution><goals><goal>repackage</goal></goals><phase>package</phase></execution></executions><configuration><excludeDevtools>true</excludeDevtools></configuration></plugin></plugins></build></project>

AppConfig:

package org.example.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;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 11:32
* @version 1.0
*/@Configuration
public class AppConfig {/*** 直接使用@LoadBalanced注解创建一个负载均衡的RestTemplate实例:*/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

Resilience4JConfig:

package org.example.config;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
import org.springframework.cloud.client.circuitbreaker.Customizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;import java.time.Duration;/**
* @description: Resilience4J Circuit Breakers 断路器提供默认配置
* @author 杨镇宇
* @date 2024/7/29 18:22
* @version 1.0
*/
@Configuration
public class Resilience4JConfig {@Beanpublic Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id).timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()).build());}
}

controller:

package org.example.controller;import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.example.exception.model.ResponseResult;
import org.example.service.TestOneService;
import org.example.vo.ScanVo;
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;/*** @author yangzhenyu* */
@OpenAPIDefinition(info = @io.swagger.v3.oas.annotations.info.Info(title = "示例 API",version = "1.0",description = "这是一个示例 API 文档"),tags = {@Tag(name = "Example", description = "示例 API")}
)
@Validated
@RestController
@Slf4j
@RequestMapping(value="api/test")
public class TestController {@Resourceprivate TestOneService service;@Operation(summary = "测试微服务调用接口",description = "测试微服务调用接口",responses = {@ApiResponse(responseCode = "200",description = "成功",content = @Content(mediaType = "application/json",schema = @Schema(implementation = ResponseResult.class))),@ApiResponse(responseCode = "400", description = "请求错误")})@CrossOrigin(origins = "*")  //处理跨域请求的注解@RequestMapping(value = "/weifuw/{path}", method = RequestMethod.GET)public ResponseResult weifuw(@PathVariable(value = "path") String path){log.info("=========调用服务B============参数:{}",path);return service.scan(path);}}

service:

/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:00
* @version 1.0
*/public interface TestOneService {ResponseResult scan(String path);}
package org.example.service.impl;import org.apache.commons.lang3.StringUtils;
import org.example.client.SpringCloudServiceBClient;
import org.example.exception.model.ResponseResult;
import org.example.service.TestOneService;
import org.example.vo.ScanVo;
import org.springframework.stereotype.Service;import javax.annotation.Resource;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:02
* @version 1.0
*/
@Service
public class TestOneServiceImpl implements TestOneService {@Resourceprivate SpringCloudServiceBClient client;@Overridepublic ResponseResult scan(String path) {ScanVo  v1 = ScanVo.builder().path(path).build();String scan = client.scan(v1);if (StringUtils.isNotBlank(scan)){return ResponseResult.ok(scan);}return null;}
}

Client:

package org.example.client;import org.example.vo.ScanVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:04
* @version 1.0
*/
@FeignClient(name = "springCloudServiceB", fallback = SpringCloudServiceBClientFallback.class)
public interface SpringCloudServiceBClient {@RequestMapping(value = "/api/test/scan", method = RequestMethod.POST)String scan(@RequestBody ScanVo scanVo);
}
package org.example.client;import org.example.exception.ExceptionEnum;
import org.example.exception.ResultCode;
import org.example.exception.throwtype.RunException;
import org.example.vo.ScanVo;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;/**
* @description: TODO
* @author 杨镇宇
* @date 2024/7/29 15:13
* @version 1.0
*/
@Component
public class SpringCloudServiceBClientFallback implements SpringCloudServiceBClient{//自定义的降级处理逻辑@Overridepublic String scan(ScanVo scanVo) {ResultCode r = ExceptionEnum.FALLBACK_RESPONSE_ERROR;r.setDesc("---springCloudServiceB----" + HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase());throw  new RunException(r);}
}

yml:

server:port: 9008zipkin:base-url: http://127.0.0.1:9411/#让nacos把它当成一个URL,而不要当做服务名discovery-client-enabled: false
eureka:instance:prefer-ip-address: true # 优先ip注册client:service-url:defaultZone: http://127.0.0.1:8761/eureka # 注册中心地址down:url: http://127.0.0.1:8761/actuator/service-registry?status=DOWN
feign:client:config:default:connectTimeout: 60000  # 连接超时时间,单位毫秒readTimeout: 60000  # 读取超时时间,单位毫秒circuitbreaker:enabled: true
resilience4j.circuitbreaker: # 保护服务不被外部不稳定的服务影响,避免连锁故障。configs:default:slidingWindowSize: 50 # 滑动窗口的大小为 100。permittedNumberOfCallsInHalfOpenState: 10 # 在半开状态下,允许10次调用以测试服务是否恢复正常。waitDurationInOpenState: 50s # 断路器在打开状态下等待50秒后,尝试进入半开状态。failureRateThreshold: 60 # 如果失败率超过 60%,则断路器会切换到打开状态。eventConsumerBufferSize: 10 # 用于事件消费的缓冲区大小,设置为 10registerHealthIndicator: true # 是否注册健康指示器,允许通过 /actuator/health 端点监控断路器状态。someShared: # 共享的配置模板slidingWindowSize: 50 # 滑动窗口的大小为 50,即窗口内包含最近 50 次调用的数据。permittedNumberOfCallsInHalfOpenState: 10 # 在半开状态下,允许 10 次调用来测试服务是否恢复正常。instances:springCloudServiceB:registerHealthIndicator: true # 注册健康指示器,可以通过/actuator/health监控断路器状态。slidingWindowSize: 50 # 滑动窗口的大小为 100。minimumNumberOfCalls: 20 # 至少20次调用后开始计算失败率。permittedNumberOfCallsInHalfOpenState: 10  # 在半开状态下,允许10次调用以测试服务是否恢复正常。waitDurationInOpenState: 50s # 断路器在打开状态下等待50秒后,尝试进入半开状态。slidingWindowType: TIME_BASED #滑动窗口类型为时间基础型(TIME_BASED),即基于时间的窗口。
resilience4j.timelimiter: # 限制外部服务的响应时间,防止服务被长时间挂起。configs:default:timeoutDuration: 2s # 设置操作的超时时间为 2 秒。如果操作在 2 秒内没有完成,将会被取消。cancelRunningFuture: true # 是否在超时后取消正在运行的操作。instances:springCloudServiceB:timeoutDuration: 2s # 设置操作的超时时间为 2 秒。如果操作在 2 秒内没有完成,将会被取消。cancelRunningFuture: true # 是否在超时后取消正在运行的操作。
spring:sleuth:zipkin:http:connect-timeout: 5000 # 连接超时设置为5秒read-timeout: 10000   # 读取超时设置为10秒application:name: springCloudServiceAcloud:loadbalancer:retry:enabled: true  # 启用重试maxAttempts: 3  # 设置最大重试次数backoff:initialInterval: 1000  # 初始重试间隔时间(毫秒)maxInterval: 3000  # 最大重试间隔时间(毫秒)multiplier: 1.5  # 间隔时间增量因子service-instance-selector: random # 全局使用随机负载均衡策略datasource:dynamic: # druid连接池配置primary: master #默认数据源datasource:master: #主库配置username: TESTDB  #TESTDBpassword: ENC(xuBgV6ZA7A6LSZ8PbaAFWg==) #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jslave: #从库配置username: TESTDB  #TESTDBpassword: ENC(xuBgV6ZA7A6LSZ8PbaAFWg==)  #TESTDBdriver-class-name: ${datasource_driver_class_name:com.mysql.cj.jdbc.Driver}url: ${datasource_url:jdbc:mysql://127.0.0.1:3306/TESTDB?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC}druid:initial-size: 5 #启动程序时,在连接池中初始化多少个连接max-active: 20 #连接池中最多支持多少个活动会话min-idle: 5 #回收空闲连接时,将保证至少有minIdle个连接max-wait: 60000 #程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池filters: stat,wall,slf4jspringdoc:api-docs:path: /v3/api-docsswagger-ui:path: /swagger-ui.html
management:endpoints:web:exposure:include: health, metrics, info, httptrace#jasypt:
#  encryptor:
#    property: resolver # 使用自定义的 EncryptablePropertyResolver
#    bean: encryptionPropertyResolver
#logging:
#  level:
#    org.springframework: DEBUGjasypt:encryptor:#password  本地环境将密钥放入yml文件中,生产需要jvm携带 -Djasypt.encryptor.password=xxxxxpassword: yzy_@user!1Uxalgorithm: PBEWithMD5AndDESiv-generator-classname: org.jasypt.iv.NoIvGenerator
3.2. 服务B接受接口

/*** @author yangzhenyu* */
@Validated
@RestController
@Slf4j
@RequestMapping(value="api/test")
public class TestController {@Operation(summary = "测试接口",description = "通过微服务调触发此测试接口",requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "调用测试接口的对象",required = true,content = @Content(mediaType = "application/json",schema = @Schema(implementation = ScanVo.class))),responses = {@ApiResponse(responseCode = "201", description = "测试成功"),@ApiResponse(responseCode = "400", description = "请求错误")})@CrossOrigin(origins = "*")  //处理跨域请求的注解@RequestMapping(value = "/scan", method = RequestMethod.POST)public String scan(@Validated @RequestBody ScanVo scanVo) {String format = String.format("路径 %s!", scanVo.getPath());log.info(format);return format;}}
http://www.yayakq.cn/news/444026/

相关文章:

  • 成都网站建设 lkcms云南网站建设优化技术
  • 浦东做网站律师事务所免费咨询
  • 零代码自助建站平台手机app制作视频教程
  • 网站建设 广告推广博客网站开发技术
  • 郑州网站建设庄园wordpress版权声明
  • p2vr做的网站上传wordpress my vistors
  • h5网站开发实例教程企业搜索平台
  • 碑林微网站建设太原网站优化方案
  • 龙岗网站建设找深一新闻营销发稿平台
  • 建设银行网站不能登录密码错误国外企业网络平台
  • wordpress建娱乐站最好用的设计网站
  • asp+sql server典型网站建设案例通辽网站开发招聘
  • 个人网站名称请用什么软件做楼盘微网站
  • seo做的比较好的网站的几个特征公司网站报价
  • 淘宝网站建设步骤东营 网站建设
  • 网站模板 自适应上海公司注册查询官网
  • 中国十大小说网站排名sem竞价托管公司
  • 网站建设与管理专业好不好就业完整开发网站需要什么
  • 软件企业公司网站模板下载高性能的网站建设指南
  • 大连 网站建设wordpress 知识库模板
  • 高端的网站设计制作网站推广营销方法
  • 小学网站建设情况汇报网站服务器怎么建设
  • 宁波建网站需要什么如何做阿里巴巴国际网站
  • 怎样给网站做排名优化网站建设杭州哪家便宜
  • 莱芜受欢迎的网站建设智能硬件开发
  • 什么犁网站做淘宝门头如何向百度提交站点收录信息
  • 网站开发与app开发原理做外贸到什么网站上发布比较好
  • 贝尔利网站白山网站seo
  • 哪家做网站公司好网站会员系统源码
  • 开封市建设银行网站clo3d代做网站