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

django网站开发过程2022最新热点事件及点评

django网站开发过程,2022最新热点事件及点评,c语言网站开发,注册网站手机号收验证码SpringClould微服务 拆分项目步骤#xff1a; 创建模块 导入依赖 复制启动类 复制配置文件 application.yaml 复制有关此模块的代码#xff08;domain、controller、service、mapper#xff09; 新建数据库 配置启动项服务注册#xff1a; !--nacos 服务注册发现-- 创建模块 导入依赖 复制启动类 复制配置文件 application.yaml 复制有关此模块的代码domain、controller、service、mapper 新建数据库 配置启动项服务注册 !--nacos 服务注册发现-- dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependencyspring:application:name: item-service # 服务名称cloud:nacos:server-addr: 192.168.150.101:8848 # nacos地址配置启动项 VM options中参数 -Dserver.port8081 OpenFeign !--openFeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!--负载均衡器--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency在启动类上添加开启注解 EnableFeignClients //1.声明扫描包 EnableFeignClients(basePackages com.hmall.api.client) //2.声明要用的FeignClient EnableFeignClients(clients {ItemClient.class})定义接口 package com.hmall.cart.client;FeignClient(item-service) public interface ItemClient {GetMapping(/items)ListItemDTO queryItemByIds(RequestParam(ids) CollectionLong ids); }使用FeignClient注入ItemClient使用 连接池 Feign底层发起http请求依赖于其它的框架。其底层支持的http客户端实现包括 HttpURLConnection默认实现不支持连接池Apache HttpClient 支持连接池OKHttp支持连接池 使用带有连接池的客户端来代替默认的HttpURLConnection。 !--OK http 的依赖 -- dependencygroupIdio.github.openfeign/groupIdartifactIdfeign-okhttp/artifactId /dependencyfeign:okhttp:enabled: true # 开启OKHttp功能日志配置 package com.hmall.api.config;import feign.Logger; import org.springframework.context.annotation.Bean;// 配置类定义Feign的日志级别 public class DefaultFeignConfig {Beanpublic Logger.Level feignLogLevel(){return Logger.Level.FULL;} }局部生效在某个FeignClient中配置只对当前FeignClient生效 FeignClient(value item-service, configuration DefaultFeignConfig.class)全局生效在EnableFeignClients中配置针对所有FeignClient生效。 EnableFeignClients(defaultConfiguration DefaultFeignConfig.class)网关路由 创建网关微服务引入SpringCloudGateway、NacosDiscovery依赖编写启动类配置网关路由 创建新模块命名hm-gateway ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdhmall/artifactIdgroupIdcom.heima/groupIdversion1.0.0/version/parentmodelVersion4.0.0/modelVersionartifactIdhm-gateway/artifactIdpropertiesmaven.compiler.source11/maven.compiler.sourcemaven.compiler.target11/maven.compiler.target/propertiesdependencies!--common--dependencygroupIdcom.heima/groupIdartifactIdhm-common/artifactIdversion1.0.0/version/dependency!--网关--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId/dependency!--nacos discovery--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency!--负载均衡--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency/dependenciesbuildfinalName${project.artifactId}/finalNamepluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build /projectpackage com.hmall.gateway;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);} }server:port: 8080 spring:application:name: gatewaycloud:nacos:server-addr: 192.168.150.101:8848gateway:routes:- id: item # 路由规则id自定义唯一uri: lb://item-service # 路由的目标服务lb代表负载均衡会从注册中心拉取服务列表predicates: # 路由断言判断当前请求是否符合当前规则符合则路由到目标服务- Path/items/**,/search/** # 这里是以请求路径作为判断规则- id: carturi: lb://cart-servicepredicates:- Path/carts/**- id: useruri: lb://user-servicepredicates:- Path/users/**,/addresses/**- id: tradeuri: lb://trade-servicepredicates:- Path/orders/**- id: payuri: lb://pay-servicepredicates:- Path/pay-orders/**重点关注predicates也就是路由断言。SpringCloudGateway中支持的断言类型有很多 名称说明示例After是某个时间点后的请求- After2037-01-20T17:42:47.789-07:00[America/Denver]Before是某个时间点之前的请求- Before2031-04-13T15:14:47.43308:00[Asia/Shanghai]Between是某两个时间点之前的请求- Between2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]Cookie请求必须包含某些cookie- Cookiechocolate, ch.pHeader请求必须包含某些header- HeaderX-Request-Id, \dHost请求必须是访问某个host域名- Host.somehost.org,.anotherhost.orgMethod请求方式必须是指定方式- MethodGET,POSTPath请求路径必须符合指定规则- Path/red/{segment},/blue/**Query请求参数必须包含指定参数- Queryname, Jack或者- QuerynameRemoteAddr请求者的ip必须是指定范围- RemoteAddr192.168.1.1/24weight权重处理 网关登录校验 GatewayFilter路由过滤器作用范围比较灵活可以是任意指定的路由Route.GlobalFilter全局过滤器作用范围是所有路由不可配置。 Gateway中内置了很多的GatewayFilter详情可以参考官方文档 https://docs.spring.io/spring-cloud-gateway/docs/3.1.7/reference/html/#gatewayfilter-factories 自定义GlobalFilter 登陆过滤器 package com.hmall.gateway.filter;Component RequiredArgsConstructor EnableConfigurationProperties(AuthProperties.class) public class AuthGlobalFilter implements GlobalFilter, Ordered {private final JwtTool jwtTool;private final AuthProperties authProperties;private final AntPathMatcher antPathMatcher new AntPathMatcher();Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取RequestServerHttpRequest request exchange.getRequest();// 2.判断是否不需要拦截if(isExclude(request.getPath().toString())){// 无需拦截直接放行return chain.filter(exchange);}// 3.获取请求头中的tokenString token null;ListString headers request.getHeaders().get(authorization);if (!CollUtils.isEmpty(headers)) {token headers.get(0);}// 4.校验并解析tokenLong userId null;try {userId jwtTool.parseToken(token);} catch (UnauthorizedException e) {// 如果无效拦截ServerHttpResponse response exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}// 5.如果有效传递用户信息String userInfo userId.toString();ServerWebExchange ex exchange.mutate().request(b - b.header (user-info,userInfo)).build();// 6.放行return chain.filter(exchange);}private boolean isExclude(String antPath) {for (String pathPattern : authProperties.getExcludePaths()) {if(antPathMatcher.match(pathPattern, antPath)){return true;}}return false;}Overridepublic int getOrder() {return 0;} }微服务获取用户 保存用户到请求头 // 5.如果有效传递用户信息String userInfo userId.toString();ServerWebExchange ex exchange.mutate().request(b - b.header (user-info,userInfo)).build();// 6.放行return chain.filter(exchange);拦截器获取用户 在hm-common模块下定义一个拦截器 package com.hmall.common.interceptor;public class UserInfoInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 1.获取请求头中的用户信息String userInfo request.getHeader(user-info);// 2.判断是否为空if (StrUtil.isNotBlank(userInfo)) {// 不为空保存到ThreadLocalUserContext.setUser(Long.valueOf(userInfo));}// 3.放行return true;}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 移除用户UserContext.removeUser();} }接着在hm-common模块下编写SpringMVC的配置类配置登录拦截器 package com.hmall.common.config;import com.hmall.common.interceptor.UserInfoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Configuration public class MvcConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new UserInfoInterceptor());} }不过需要注意的是这个配置类默认是不会生效的因为它所在的包是com.hmall.common.config与其它微服务的扫描包不一致无法被扫描到因此无法生效。 基于SpringBoot的自动装配原理我们要将其添加到resources目录下的META-INF/spring.factories文件中 org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.hmall.common.config.MyBatisConfig,\com.hmall.common.config.MvcConfigOpenFeign传递用户 微服务之间调用是基于OpenFeign来实现的并不是我们自己发送的请求。 这里要借助Feign中提供的一个拦截器接口feign.RequestInterceptor 在hm-api模块的com.hmall.api.config.DefaultFeignConfig中编写这个拦截器 Bean public RequestInterceptor userInfoRequestInterceptor(){return new RequestInterceptor() {Overridepublic void apply(RequestTemplate template) {// 获取登录用户Long userId UserContext.getUser();if(userId null) {// 如果为空则直接跳过return;}// 如果不为空则放入请求头中传递给下游微服务template.header(user-info, userId.toString());}}; }现在微服务之间通过OpenFeign调用时也会传递登录用户信息了。 配置管理 可以把微服务共享的配置抽取到Nacos中统一管理这样就不需要每个微服务都重复配置了。分为两步 在Nacos中添加共享配置微服务拉取配置 在nacos控制台分别添加这些配置。 首先是jdbc相关配置在配置管理-配置列表中点击新建一个配置 spring:datasource:url: jdbc:mysql://${hm.db.host:192.168.150.101}:${hm.db.port:3306}/${hm.db.database}?useUnicodetruecharacterEncodingUTF-8autoReconnecttrueserverTimezoneAsia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: ${hm.db.un:root}password: ${hm.db.pw:123} mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto注意这里的jdbc的相关参数并没有写死例如 数据库ip通过${hm.db.host:192.168.150.101}配置了默认值为192.168.150.101同时允许通过${hm.db.host}来覆盖默认值数据库端口通过${hm.db.port:3306}配置了默认值为3306同时允许通过${hm.db.port}来覆盖默认值数据库database可以通过${hm.db.database}来设定无默认值 日志配置命名为shared-log.yaml配置内容如下 logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: logs/${spring.application.name}swagger配置命名为shared-swagger.yaml配置内容如下 knife4j:enable: trueopenapi:title: ${hm.swagger.title:黑马商城接口文档}description: ${hm.swagger.description:黑马商城接口文档}email: ${hm.swagger.email:zhanghuyiitcast.cn}concat: ${hm.swagger.concat:虎哥}url: https://www.itcast.cnversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- ${hm.swagger.package}拉取共享配置 SpringCloud在初始化上下文的时候会先读取一个名为bootstrap.yaml(或者bootstrap.properties)的文件如果我们将nacos地址配置到bootstrap.yaml中那么在项目引导阶段就可以读取nacos中的配置了。 在cart-service模块引入依赖 !--nacos配置管理--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--读取bootstrap文件--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependency新建bootstrap.yaml spring:application:name: cart-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.150.101 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置修改application.yaml 由于一些配置挪到了bootstrap.yaml因此application.yaml需要修改为 server:port: 8082 feign:okhttp:enabled: true # 开启OKHttp连接池支持 hm:swagger:title: 购物车服务接口文档package: com.hmall.cart.controllerdb:database: hm-cart配置热更新 在Nacos中添加配置在微服务读取配置 注意文件的dataId格式 [服务名]-[spring.active.profile].[后缀名]文件名称由三部分组成 服务名我们是购物车服务所以是cart-servicespring.active.profile就是spring boot中的spring.active.profile可以省略则所有profile共享该配置后缀名例如yaml 这里我们直接使用cart-service.yaml这个名称则不管是dev还是local环境都可以共享该配置。 配置内容如下 hm:cart:maxAmount: 1 # 购物车商品数量上限在cart-service中新建一个属性读取类 package com.hmall.cart.config;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Data Component ConfigurationProperties(prefix hm.cart) public class CartProperties {private Integer maxAmount; }接着在业务中使用该属性加载类 无需重启服务配置热更新就生效了 微服务保护 微服务保护的方案有很多比如 请求限流线程隔离服务熔断 都属于服务降级的方案 1.请求限流 限制或控制接口访问的并发流量避免服务因流量激增而出现故障。请求限流往往会有一个限流器数量高低起伏的并发请求曲线经过限流器就变的非常平稳。 2.线程隔离 当一个业务接口响应时间长而且并发高时就可能耗尽服务器的线程资源导致服务内的其它接口受到影响。 线程隔离的思想来自轮船的舱壁模式轮船的船舱会被隔板分割为N个相互隔离的密闭舱假如轮船触礁进水只有损坏的部分密闭舱会进水而其他舱由于相互隔离并不会进水。 我们可以限定每个接口可以使用的资源范围也就是将其“隔离”起来。 3.服务熔断 编写服务降级逻辑就是服务调用失败后的处理逻辑根据业务场景可以抛出异常也可以返回友好提示或默认数据。异常统计和熔断统计服务提供方的异常比例当比例过高表明该接口会影响到其它服务应该拒绝调用该接口而是直接走降级逻辑。 Sentinel 启动命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar微服务整合 在cart-service模块中整合sentinel连接sentinel-dashboard控制台步骤如下 1引入sentinel依赖 !--sentinel-- dependencygroupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-sentinel/artifactId /dependency2配置控制台 修改application.yaml文件添加下面内容 spring:cloud: sentinel:transport:dashboard: localhost:80903访问cart-service的任意端点 重启cart-service然后访问查询购物车接口sentinel的客户端就会将服务访问的信息提交到sentinel-dashboard控制台。并展示出统计信息 我们的SpringMVC接口是按照Restful风格设计因此购物车的查询、删除、修改等接口全部都是/carts路径 选择打开Sentinel的请求方式前缀把请求方式 请求路径作为簇点资源名 spring:cloud:sentinel:transport:dashboard: localhost:8090http-method-specify: true # 开启请求方式前缀配置 请求限流QPS6 配置 线程隔离 OpenFeign整合Sentinel 修改cart-service模块的application.yml文件开启Feign的sentinel功能 feign:sentinel:enabled: true # 开启feign对sentinel的支持重启cart-service服务可以看到查询商品的FeignClient自动变成了一个簇点资源 点击查询商品的FeignClient对应的簇点资源后面的流控按钮 配置 并发线程数5 服务熔断 我们利用线程隔离对查询购物车业务进行隔离保护了购物车服务的其它接口。由于查询商品的功能耗时较高我们模拟了500毫秒延时再加上线程隔离限定了线程数为5导致接口吞吐能力有限最终QPS只有10左右。这就导致了几个问题 第一超出的QPS上限的请求就只能抛出异常从而导致购物车的查询失败。但从业务角度来说即便没有查询到最新的商品信息购物车也应该展示给用户用户体验更好。也就是给查询失败设置一个降级处理逻辑。 第二由于查询商品的延迟较高模拟的500ms从而导致查询购物车的响应时间也变的很长。这样不仅拖慢了购物车服务消耗了购物车服务的更多资源而且用户体验也很差。对于商品服务这种不太健康的接口我们应该直接停止调用直接走降级逻辑避免影响到当前服务。也就是将商品查询接口熔断。 给FeignClient编写失败后的降级逻辑有两种方式 方式一FallbackClass无法对远程调用的异常做处理方式二FallbackFactory可以对远程调用的异常做处理我们一般选择这种方式。 编写降级策略 1.在hm-api模块中给ItemClient定义降级处理类实现FallbackFactory package com.hmall.api.client.fallback;Slf4j public class ItemClientFallback implements FallbackFactoryItemClient {Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {Overridepublic ListItemDTO queryItemByIds(CollectionLong ids) {log.error(远程调用ItemClient#queryItemByIds方法出现异常参数{}, ids, cause);// 查询购物车允许失败查询失败返回空集合return CollUtils.emptyList();}Overridepublic void deductStock(ListOrderDetailDTO items) {// 库存扣减业务需要触发事务回滚查询失败抛出异常throw new BizIllegalException(cause);}};} }2.在hm-api模块中的com.hmall.api.config.DefaultFeignConfig类中将ItemClientFallback注册为一个Bean Bean public ItemClientFallbackFactory itemClientFallbackFactory(){return new ItemClientFallbackFactory(); }3.在hm-api模块中的ItemClient接口中使用ItemClientFallbackFactory FeignClient(name item-service,fallbackFactory ItemClientFallbackFactory.class) public interface ItemClient {GetMapping(/items)ListItemDTO queryItemByIds(RequestParam(ids) CollectionLong ids);PutMapping(/items/stock/deduct)void deductStock(RequestBody ListOrderDetailDTO items); }服务熔断 状态机包括三个状态 closed关闭状态断路器放行所有请求并开始统计异常比例、慢请求比例。超过阈值则切换到open状态open打开状态服务调用被熔断访问被熔断服务的请求会被拒绝快速失败直接走降级逻辑。Open状态持续一段时间后会进入half-open状态half-open半开状态放行一次请求根据执行结果来判断接下来的操作。 请求成功则切换到closed状态请求失败则切换到open状态 我们可以在控制台通过点击簇点后的**熔断**按钮来配置熔断策略 熔断策略慢调用比例最大ResponseTime200ms比例阈值0.5熔断时长20s最小请求数5统计时长1000ms这种是按照慢调用比例来做熔断上述配置的含义是 RT超过200毫秒的请求调用就是慢调用统计最近1000ms内的最少5次请求如果慢调用比例不低于0.5则触发熔断熔断持续时长20s 分布式事务 在Seata的事务管理中有三个重要的角色 TC (Transaction Coordinator) - **事务协调者**维护全局和分支事务的状态协调全局事务提交或回滚。TM (Transaction Manager) - **事务管理器**定义全局事务的范围、开始全局事务、提交或回滚全局事务。RM (Resource Manager) - **资源管理器**管理分支事务与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回滚。 导入数据库表 CREATE DATABASE IF NOT EXISTS seata; USE seata;CREATE TABLE IF NOT EXISTS global_table (xid VARCHAR(128) NOT NULL,transaction_id BIGINT,status TINYINT NOT NULL,application_id VARCHAR(32),transaction_service_group VARCHAR(32),transaction_name VARCHAR(128),timeout INT,begin_time BIGINT,application_data VARCHAR(2000),gmt_create DATETIME,gmt_modified DATETIME,PRIMARY KEY (xid),KEY idx_status_gmt_modified (status , gmt_modified),KEY idx_transaction_id (transaction_id) ) ENGINE InnoDBDEFAULT CHARSET utf8mb4;CREATE TABLE IF NOT EXISTS branch_table (branch_id BIGINT NOT NULL,xid VARCHAR(128) NOT NULL,transaction_id BIGINT,resource_group_id VARCHAR(32),resource_id VARCHAR(256),branch_type VARCHAR(8),status TINYINT,client_id VARCHAR(64),application_data VARCHAR(2000),gmt_create DATETIME(6),gmt_modified DATETIME(6),PRIMARY KEY (branch_id),KEY idx_xid (xid) ) ENGINE InnoDBDEFAULT CHARSET utf8mb4;CREATE TABLE IF NOT EXISTS lock_table (row_key VARCHAR(128) NOT NULL,xid VARCHAR(128),transaction_id BIGINT,branch_id BIGINT NOT NULL,resource_id VARCHAR(256),table_name VARCHAR(32),pk VARCHAR(36),status TINYINT NOT NULL DEFAULT 0 COMMENT 0:locked ,1:rollbacking,gmt_create DATETIME,gmt_modified DATETIME,PRIMARY KEY (row_key),KEY idx_status (status),KEY idx_branch_id (branch_id),KEY idx_xid_and_branch_id (xid , branch_id) ) ENGINE InnoDBDEFAULT CHARSET utf8mb4;CREATE TABLE IF NOT EXISTS distributed_lock (lock_key CHAR(20) NOT NULL,lock_value VARCHAR(20) NOT NULL,expire BIGINT,primary key (lock_key) ) ENGINE InnoDBDEFAULT CHARSET utf8mb4;INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (AsyncCommitting, , 0); INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (RetryCommitting, , 0); INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (RetryRollbacking, , 0); INSERT INTO distributed_lock (lock_key, lock_value, expire) VALUES (TxTimeoutCheck, , 0);准备配置文件 server:port: 7099spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seata# extend:# logstash-appender:# destination: 127.0.0.1:4560# kafka-appender:# bootstrap-servers: 127.0.0.1:9092# topic: logback_to_logstashconsole:user:username: adminpassword: adminseata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 36.138.103.23:8848group : DEFAULT_GROUPnamespace: dataId: seataServer.propertiesusername: nacospassword: nacosregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 36.138.103.23:8848group : DEFAULT_GROUPnamespace: username: nacospassword: nacos # server: # service-port: 8091 #If not configured, the default is ${server.port} 1000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/loginserver:# service-port: 8091 #If not configured, the default is ${server.port} 1000max-commit-retry-timeout: -1max-rollback-retry-timeout: -1rollback-retry-timeout-unlock-enable: falseenable-check-auth: trueenable-parallel-request-handle: trueretry-dead-threshold: 130000xaer-nota-retry-timeout: 60000enableParallelRequestHandle: truerecovery:committing-retry-period: 1000async-committing-retry-period: 1000rollbacking-retry-period: 1000timeout-retry-period: 1000undo:log-save-days: 7log-delete-period: 86400000session:branch-async-queue-size: 5000 #branch async remove queue sizeenable-branch-async-remove: false #enable to asynchronous remove branchSessionstore:# support: file 、 db 、 redismode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://36.138.103.23:3306/seata?rewriteBatchedStatementstrueuser: rootpassword: 123zxc..min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000redis:mode: singledatabase: 0min-conn: 10max-conn: 100password:max-total: 100query-limit: 1000single:host: 192.168.150.101port: 6379metrics:enabled: falseregistry-type: compactexporter-list: prometheusexporter-prometheus-port: 9898transport:rpc-tc-request-timeout: 15000enable-tc-server-batch-send-response: falseshutdown:wait: 3thread-factory:boss-thread-prefix: NettyBossworker-thread-prefix: NettyServerNIOWorkerboss-thread-size: 1 docker命令启动 docker run --name seata \ -p 8099:8099 \ -p 7099:7099 \ -e SEATA_IP36.138.103.23 \ -v ./seata:/seata-server/resources \ --privilegedtrue \ -d \ seataio/seata-server:1.5.2微服务集成Seata !--统一配置管理--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency!--读取bootstrap文件--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependency!--seata--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency!--sentinel--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency改造配置 首先在nacos上添加一个共享的seata配置命名为shared-seata.yaml seata:registry: # TC服务注册中心的配置微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.150.101:8848 # nacos地址namespace: # namespace默认为空group: DEFAULT_GROUP # 分组默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: defaultdata-source-proxy-mode: XA # 开启XA模式,强一致性默认为AT模式添加bootstrap.yaml spring:application:name: trade-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.150.101 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置- dataId: shared-seata.yaml # 共享seata配置改造application.yaml文件 server:port: 8085 feign:okhttp:enabled: true # 开启OKHttp连接池支持sentinel:enabled: true # 开启Feign对Sentinel的整合 hm:swagger:title: 交易服务接口文档package: com.hmall.trade.controllerdb:database: hm-trade添加数据库表seata-at.sql 分别文件导入hm-trade、hm-cart、hm-item微服务需要开启事务的每个数据库 -- for AT mode you must to init this sql for you business database. the seata server not need it. CREATE TABLE IF NOT EXISTS undo_log (branch_id BIGINT NOT NULL COMMENT branch transaction id,xid VARCHAR(128) NOT NULL COMMENT global transaction id,context VARCHAR(128) NOT NULL COMMENT undo_log context,such as serialization,rollback_info LONGBLOB NOT NULL COMMENT rollback info,log_status INT(11) NOT NULL COMMENT 0:normal status,1:defense status,log_created DATETIME(6) NOT NULL COMMENT create datetime,log_modified DATETIME(6) NOT NULL COMMENT modify datetime,UNIQUE KEY ux_undo_log (xid, branch_id) ) ENGINE InnoDBAUTO_INCREMENT 1DEFAULT CHARSET utf8mb4 COMMENT AT transaction mode undo table; 将需要开启事务的方法上Transactional注解改为Seata提供的GlobalTransactional
http://www.zqtcl.cn/news/70533/

相关文章:

  • 珠宝商城网站模板专门找人做软件的网站
  • python做网站有什么弊端深圳网页设计培训中心
  • yiqicms主站调用一级目录wordpress博客的文章?ui设计师创意平台
  • 网站建设公司如何转型上海app定制
  • 做公司网站按年收费视觉差的网站
  • 建设部监理工程师网站河北高端网站设计公司
  • 网站建设业务饱和了吗网站怎么添加栏目
  • 南昌网站建设工作室网站正在紧急建设中
  • 有做软件的网站有哪些品牌logo设计理念介绍
  • 淘宝客做网站要钱吗上海网站营销seo
  • 建网站中企动力能制作网页的软件是
  • 房山网站建设服务家教网站如何建设
  • wordpress 网站上传到服务器错误wordpress基础模板
  • 深圳市建设科技促进中心网站建站 wordpress
  • ai人工智能写作网站昆山高端网站建设
  • 山东网站推广营销设计门户网站制作哪专业
  • 智能网站建设维护高端网站建设kgu
  • 7位数qq免费申请永久关键词优化公司济南兴田德润团队怎么样
  • 静态html网址网站导航源码手机微信一体网站建设
  • 深圳网站设计网站制作深圳市信用网
  • 上海定制化网站开发公司兼职做网站安全么
  • 网站安全维护公司成都市住建局
  • 昌吉州建设局网站pinterest网站怎么进
  • 网站内容完全改变被k做纺织的都用什么网站
  • 网站设计 无锡华润集团网站建设商
  • 怎么做网站的外链网站建设零金手指花总
  • 精品课程网站建设设计方案上海外贸博览会
  • 教育营销型的网站建设怎么使用服务器做网站
  • 互联网设计是做什么的十条网站建设的seo策略
  • 大连网站建设仟亿网站项目建设策划书流程