阅读对象

传统企业正在做微服务架构转型的开发人员或者架构师,希望本文对您能起到一定的引导作用。

API网关介绍

网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由器或者桥接设备进行通信,这中间的路由或者桥接设备我们称之为网关。

相应的API网关将各系统对外暴露的服务聚合起来,所有要调用这些服务的系统都需要通过API网关进行访问,基于这种方式网关可以对API进行统一管控,例如:认证、鉴权、流量控制、协议转换、监控等等。

API网关的流行得益于近几年微服务架构的兴起,原本一个庞大的业务系统被拆分成许多粒度更小的系统进行独立部署和维护,这种模式势必会带来更多的跨系统交互,企业API的规模也会成倍增加,API网关(或者微服务网关)就逐渐成为了微服务架构的标配组件。

如下是我们整理的API网关的几种典型应用场景:

1、面向Web或者移动App

这类场景,在物理形态上类似前后端分离,前端应用通过API调用后端服务,需要网关具有认证、鉴权、缓存、服务编排、监控告警等功能。

2、面向合作伙伴开放API

这类场景,主要为了满足业务形态对外开放,与企业外部合作伙伴建立生态圈,此时的API 网关注重安全认证、权限分级、流量管控、缓存等功能的建设。

3、企业内部系统互联互通

对于中大型的企业内部往往有几十、甚至上百个系统,尤其是微服务架构的兴起系统数量更是急剧增加。系统之间相互依赖,逐渐形成网状调用关系不便于管理和维护,需要API网关进行统一的认证、鉴权、流量管控、超时熔断、监控告警管理,从而提高系统的稳定性、降低重复建设、运维管理等成本。

设计目标

1、纯Java实现;

2、支持插件化,方便开发人员自定义组件;

3、支持横向扩展,高性能;

4、避免单点故障,稳定性要高,不能因为某个API故障导致整个网关停止服务;

5、管理控制台配置更新可自动生效,不需要重启网关;

应用架构设计


整个平台拆分成3个子系统,Gateway-Core(核心子系统)、Gateway-Admin(管理中心)、Gateway-Monitor(监控中心)。

Gateway-Core负责接收客户端请求,调度、加载和执行组件,将请求路由到上游服务端,处理上游服务端返回的结果等;

Gateway-Admin提供统一的管理界面,用户可在此进行API、组件、系统基础信息的设置和维护;

Gateway-Monitor负责收集监控日志、生成各种运维管理报表、自动告警等;

系统架构设计


说明:

1、网关核心子系统通过HAProxy或者Nginx进行负载均衡,为避免正好路由的LB节点服务不可用,可以考虑在此基础上增加Keepalived来实现LB的失效备援,当LB Node1停止服务,Keepalived会将虚拟IP自动飘移到LB2,从而避免因为负载均衡器导致单点故障。DNS可以直接指向Keepalived的虚拟IP。

2、网关除了对性能要求很高外,对稳定性也有很高的要求,引入Zookeeper及时将Admin对API的配置更改同步刷新到各网关节点。

3、管理中心和监控中心可以采用类似网关子系统的高可用策略,如果嫌麻烦管理中心可以省去Keepalived,相对来说管理中心没有这么高的可用性要求。

4、理论上监控中心需要承载很大的数据量,比如有1000个API,平均每个API一天调用10万次,对于很多互联网公司单个API的量远远大于10万,如果将每次调用的信息都存储起来是不现实的,也没有太大的必要。可以考虑将每个API每分钟的调用情况汇总后进行存储,比如1分钟的平均响应时间、次数、流量、正确率等等。

5、数据库选型可以灵活考虑,原则上网关在运行时要尽可能减少对DB的依赖,否则IO延时会严重影响网关性能。可以考虑首次访问后将API配置信息缓存,Admin对API配置更改后通过Zookeeper通知网关刷新,这样一来DB的访问量可以忽略不计,团队可根据自身偏好灵活选型。

非阻塞式HTTP服务

管理和监控中心可以根据团队的情况采用自己熟悉的Servlet容器部署,网关核心子系统对性能的要求非常高,考虑采用NIO的网络模型,实现纯HTTP服务即可,不需要实现Servlet容器,推荐Netty框架(设计优雅,大名鼎鼎的Spring Webflux默认都是使用的Netty,更多的优势就不在此详述了),内部测试在相同的机器上分别通过Tomcat和Netty生成UUID,Netty的性能大约有20%的提升,如果后端服务响应耗时较高的话吞吐量还有更大的提升。(补充:Netty4.x的版本即可,不要采用5以上的版本,有严重的缺陷没有解决)

采用Netty作为Http容器首先需要解决的是Http协议的解析和封装,好在Netty本身提供了这样的Handler,具体参考如下代码:

1、构建一个单例的HttpServer,在SpringBoot启动的时候同时加载并启动Netty服务

            int sobacklog = Integer.parseInt(AppConfigUtil.getValue("netty.sobacklog"));ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(this.portHTTP)).option(ChannelOption.SO_BACKLOG, sobacklog).childHandler(new ChannelHandlerInitializer(null));// 绑定端口ChannelFuture f = b.bind(this.portHTTP).sync();logger.info("HttpServer name is " + HttpServer.class.getName() + " started and listen on " + f.channel().localAddress());

2、初始化Handler

@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline p = ch.pipeline();p.addLast(new HttpRequestDecoder());p.addLast(new HttpResponseEncoder());int maxContentLength = 2000;try {maxContentLength = Integer.parseInt(AppConfigUtil.getValue("netty.maxContentLength"));} catch (Exception e) {logger.warn("netty.maxContentLength配置异常,系统默认为:2000KB");}p.addLast(new HttpObjectAggregator(maxContentLength * 1024));// HTTP 消息的合并处理p.addLast(new HttpServerInboundHandler());}

HttpRequestDecoder和HttpResponseEncoder分别实现Http协议的解析和封装,Http Post内容超过一个数据包大小会自动分组,通过HttpObjectAggregator可以自动将这些数据粘合在一起,对于上层收到是一个完整的Http请求。

3、通过HttpServerInboundHandler将网络请求转发给网关执行器

@Overridepublic void channelRead0(ChannelHandlerContext ctx, Object msg)throws Exception {try {if (msg instanceof HttpRequest && msg instanceof HttpContent) {CmptRequest cmptRequest = CmptRequestUtil.convert(ctx, msg);CmptResult cmptResult = this.gatewayExecutor.execute(cmptRequest);FullHttpResponse response = encapsulateResponse(cmptResult);ctx.write(response);ctx.flush();}} catch (Exception e) {logger.error("网关入口异常," + e.getMessage());e.printStackTrace();}}

设计上建议将Netty接入层代码跟网关核心逻辑代码分离,不要将Netty收到HttpRequest和HttpContent直接给到网关执行器,可以考虑做一层转换封装成自己的Request给到执行器,方便后续可以很容易的将Netty替换成其它Http容器。(如上代码所示,CmptRequest即为自定义的Http请求封装类,CmptResult为网关执行结果类)

组件化及自定义组件支持

组件是网关的核心,大部分功能特性都可以基于组件的形式提供,组件化可以有效提高网关的扩展性。

先来看一个简单的微信认证组件的例子:

如下实现的功能是对API请求传入的Token进行校验,其结果分别是认证通过、Token过期和无效Token,认证通过后再将微信OpenID携带给上游服务系统。

/*** 微信token认证,token格式:* {appID:'',openID:'',timestamp:132525144172,sessionKey: ''}*/
public class WeixinAuthTokenCmpt extends AbstractCmpt {private static Logger logger = LoggerFactory.getLogger(WeixinAuthTokenCmpt.class);private final CmptResult SUCCESS_RESULT;public WeixinAuthTokenCmpt() {SUCCESS_RESULT = buildSuccessResult();}@Override public CmptResult execute(CmptRequest request, Map<String, FieldDTO> config) {if (logger.isDebugEnabled()) {logger.debug("WeixinTokenCmpt ......");}CmptResult cmptResult = null;//Token认证超时间(传入单位:分)long authTokenExpireTime = getAuthTokenExpireTime(config);WeixinTokenDTO authTokenDTO = this.getAuthTokenDTO(request);logger.debug("Token=" + authTokenDTO);AuthTokenState authTokenState = validateToken(authTokenDTO, authTokenExpireTime);switch (authTokenState) {case ACCESS: {cmptResult = SUCCESS_RESULT;Map<String, String> header = new HashMap<>();header.put(HeaderKeyConstants.HEADER_APP_ID_KEY, authTokenDTO.getAppID());header.put(CmptHeaderKeyConstants.HEADER_WEIXIN_OPENID_KEY, authTokenDTO.getOpenID());header.put(CmptHeaderKeyConstants.HEADER_WEIXIN_SESSION_KEY, authTokenDTO.getSessionKey());cmptResult.setHeader(header);break;}case EXPIRED: {cmptResult = buildCmptResult(RespErrCode.AUTH_TOKEN_EXPIRED, "token过期,请重新获取Token!");break;}case INVALID: {cmptResult = buildCmptResult(RespErrCode.AUTH_INVALID_TOKEN, "Token无效!");break;}}return cmptResult;}
...
}

上面例子看不懂没关系,接下来会详细阐述组件的设计思路。

1、组件接口定义

public interface ICmpt {/*** 组件执行入口** @param request* @param config,组件实例的参数配置* @return*/CmptResult execute(CmptRequest request, Map<String, FieldDTO> config);/*** 销毁组件持有的特殊资源,比如线程。*/void destroy();
}

execute是组件执行的入口方法,request前面提到过是http请求的封装,config是组件的特殊配置,比如上面例子提到的微信认证组件就有一个自定义配置-Token的有效期,不同的API应用该组件可以设置不同的有效期。

FieldDTO定义如下:

public class FieldDTO {private String title;private String name;private FieldType fieldType = FieldType.STRING;private String defaultValue;private boolean required;private String regExp;private String description;
}

2、组件类型定义

执行器需要根据组件类型和组件执行结果判断是要直接返回客户端还是继续往下面执行,比如认证类型的组件,如果认证失败是不能继续往下执行的,但缓存类型的组件没有命中才继续往下执行。当然这样设计存在一些缺陷,比如新增组件类型需要执行器配合调整处理逻辑。(Kong也提供了大量的功能组件,没有研究过其网关框架是如何跟组件配合的,是否支持用户自定义组件类型,知道的朋友详细交流下。)

初步定义如下组件类型:

认证、鉴权、流量管控、缓存、路由、日志等。

其中路由类型的组件涵盖了协议转换的功能,其负责调用上游系统提供的服务,可以根据上游系统提供API的协议定制不同的路由组件,比如:Restful、WebService、Dubbo、EJB等等。

3、组件执行位置和优先级设定

执行位置:Pre、Routing、After,分别代表后端服务调用前、后端服务调用中和后端服务调用完成后,相同位置的组件根据优先级决定执行的先后顺序。

4、组件发布形式

组件打包成标准的Jar包,通过Admin管理界面上传发布。

附-组件可视化选择UI设计



组件热插拔设计和实现

JVM中Class是通过类加载器+全限定名来唯一标识的,上面章节谈到组件是以Jar包的形式发布的,但相同组件的多个版本的入口类名需要保持不变,因此要实现组件的热插拔和多版本并存就需要自定义类加载器来实现。

大致思路如下:

网关接收到API调用请求后根据请求参数从缓存里拿到API配置的组件列表,然后再逐一参数从缓存里获取组件对应的类实例,如果找不到则尝试通过自定义类加载器载入Jar包,并初始化组件实例及缓存。

附-参考示例

public static ICmpt newInstance(final CmptDef cmptDef) {ICmpt cmpt = null;try {final String jarPath = getJarPath(cmptDef);if (logger.isDebugEnabled()) {logger.debug("尝试载入jar包,jar包路径: " + jarPath);}//加载依赖jarCmptClassLoader cmptClassLoader = CmptClassLoaderManager.loadJar(jarPath, true);// 创建实例if (null != cmptClassLoader) {cmpt = LoadClassUtil.newObject(cmptDef.getFullQualifiedName(), ICmpt.class, cmptClassLoader);} else {logger.error("加载组件jar包失败! jarPath: " + jarPath);}} catch (Exception e) {logger.error("组件类加载失败,请检查类名和版本是否正确。ClassName=" + cmptDef.getFullQualifiedName() + ", Version=" + cmptDef.getVersion());e.printStackTrace();}return cmpt;
}

补充说明:

自定义类加载器可直接需要继承至URLClassLoader,另外必须指定其父类加载器为执行器的加载器,否则组件没法引用网关的其它类。

API故障隔离及超时、熔断处理

在详细阐述设计前先讲个实际的案例,大概12年的时候某公司自研了一款ESB的中间件(企业服务总线跟API网关很类似,当年SOA理念大行其道的时候都推崇的是ESB,侧重服务的编排和异构系统的整合。),刚开始用的还行,但随着接入系统的增多,突然某天运维发现大量API出现缓慢甚至超时,初步检查发现ESB每个节点的线程几乎消耗殆尽,起初判断是资源不够,紧急扩容后还是很快线程占满,最终导致上百个系统瘫痪。

最终找到问题的症结是某个业务系统自身的原因导致服务不可用,下游业务系统请求大量堆积到ESB中,从而导致大量线程堵塞。

以上案例说明了一个在企业应用架构设计里面的经典原则-故障隔离,由于所有的API请求都要经过网关,必须隔离API之间的相互影响,尤其是个别API故障导致整个网关集群服务中断。

接下来分别介绍故障隔离、超时管控、熔断的实现思路。

1、故障隔离

有两种方式可以实现,一是为每个API创建一个线程池,每个线程分配10~20个线程,这也是常用的隔离策略,但这种方式有几个明显的缺点:

1)线程数会随着API接入数量递增,1000个API就需要2万个线程,光线程切换对CPU就是不小的开销,而其线程还需要占用一定的内存资源;

2)平均分配线程池大小导致个别访问量较大且响应时间相对较长的API吞吐量上不去;

3)Netty本身就有工作线程池了,再增加API的线程池,导致某些需要ThreadLocal特性的编程变得困难。

二是用信号量隔离,直接复用Netty的工作线程,上面线程池隔离提到的3个缺点都可以基本避免, 建议设置单个API的信号量个数小于等于Netty工作线程池数量的1/3,这样既兼顾了单个API的性能又不至于单个API的问题导致整个网关堵塞。

具体实现可以考虑直接引用成熟的开源框架,推荐Hystrix,可以同时解决超时控制和熔断。

参考配置如下:

Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(groupKey)).andCommandKey(HystrixCommandKey.Factory.asKey(commandKey )).andCommandPropertiesDefaults(HystrixCommandProperties.Setter()//舱壁隔离策略-信号量.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)//设置每组command可以申请的信号量最大数.withExecutionIsolationSemaphoreMaxConcurrentRequests(CmptInvoker.maxSemaphore)/*开启超时设置*/.withExecutionIsolationThreadInterruptOnTimeout(true)/*超时时间设置*/.withExecutionIsolationThreadTimeoutInMilliseconds(timeout).withCircuitBreakerEnabled(true)//开启熔断.withCircuitBreakerSleepWindowInMilliseconds(Constants.DEFAULT_CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS)// 5秒后会尝试闭合回路

2、超时管控

API的超时控制是必须要做的,否则上游服务即便是间歇性响应缓慢也会堵塞大量线程(虽然通过信号量隔离后不会导致整个网关线程堵塞)。

其次,每个API最好可以单独配置超时时间,但不建议可以让用户随意设置,还是要有个最大阈值。(API网关不适合需要长时间传输数据的场景,比如大文件上传或者下载、DB数据同步等)

实现上可以直接复用开源组件的功能,比如:HttpClient可以直接设置获取连接和Socket响应的超时时间,Hystrix可以对整个调用进行超时控制等。

3、熔断

熔断类似电路中的保险丝,当超过负荷或者电阻被击穿的时候自动断开对设备起到保护作用。在API网关中设置熔断的目的是快速响应请求,避免不必要的等待,比如某个API后端服务正常情况下1s以内响应,但现在因为各种原因出现堵塞大部分请求20s才能响应,虽然设置了10s的超时控制,但让请求线程等待10s超时不仅没有意义,反而会增加服务提供方的负担。

为此我们可以设置单位时间内超过多少比例的请求超时或者异常,则直接熔断链路,等待一段时间后再次尝试恢复链路。

实现层面可以直接复用Hystrix。

运行时配置更新机制

前面章节提到过出于性能考虑网关在运行时要尽可能减小对DB的访问,设计上可以将API、组件等关键内容进行缓存,这样一来性能是提升了,但也带来了新的问题,比如Admin对API或者组件进行配置调整后如何及时更新到集群的各个网关节点。

解决方案很多,比如引入消息中间件,当Admin调整配置后就往消息中心发布一条消息,各网关节点订阅消息,收到消息后刷新缓存数据。

我们在具体实现过程中采用的是Zookeeper集群数据同步机制,其实现原理跟消息中间件很类似,只不过网关在启动的时候就会向ZK节点进行注册,也是被动更新机制。

性能考虑

性能是网关一项非常重要的衡量指标,尤其是响应时间,客户端本来可以直连服务端的,现在增加了一个网关层,对于一个本身耗时几百毫秒的服务接入网关后增加几毫秒,影响倒是可以忽略不计;但如果服务本身只需要几毫秒,因为接入网关再增加一倍的延时,用户感受就会比较明显。

建议在设计上需要遵循如下原则:

1、核心网关子系统必须是无状态的,便于横向扩展。

2、运行时不依赖本地存储,尽量在内存里面完成服务的处理和中转。

3、减小对线程的依赖,采用非阻塞式IO和异步事件响应机制。

4、后端服务如果是HTTP协议,尽量采用连接池或者Http2,测试连接复用和不复用性能有几倍的差距。(TCP建立连接成本很高)

附-HttpClient连接池设置

PoolingHttpClientConnectionManager cmOfHttp = new PoolingHttpClientConnectionManager();
cmOfHttp.setMaxTotal(maxConn);
cmOfHttp.setDefaultMaxPerRoute(maxPerRoute);
httpClient = HttpClients.custom().setConnectionManager(cmOfHttp).setConnectionManagerShared(true).build();

说明:

httpClient对象可以作为类的成员变量长期驻留内存,这个是连接池复用的前提。

结语

API网关作为企业API服务的汇聚中心,其良好的性能、稳定性和可扩展性是基础,只有这个基础打扎实了,我们才能在上面扩展更多的特性。

这篇文章主要介绍网关的总体架构设计, 后面的篇幅在详细探讨下各种组件的具体设计和实现。

有兴趣的朋友可以加入QQ交流群:244054462,备注:API网关架构设计交流。

附-产品介绍

http://www.xbgateway.com/


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. winform安装项目、安装包的制作、部署

    ①1,解决方案—添加—新建项目—其他项目类型—安装和部署—安装项目,输入名称Setup,点“确定”2,添加主输出:单击左侧“应用程序文件夹”,右侧右键—添加—项目输出-主输出-确定。3,添加开始程序中的文件夹:右击左侧“用户的程序菜单”—添加—文件夹,自己设置名称。…...

    2024/4/16 20:57:16
  2. JAVA中url的特殊字符处理及url转码解码

    在url中 , 只能使用url合法的字符 . 如果使用了非法字符来访问某资源(如:+#等) , 就会导致资源访问异常或失败 . 同时原生url中也是不支持中文的 , 以百度为例 , 当你搜索了中文关键词时 , 可以在url地址栏中明显的看出来中文被"编码转换了" . 本章暂时先不讨论特殊代…...

    2024/4/17 12:13:01
  3. Django REST framework API开发

    REST介绍RESTful API 设计实现API的两种方式FBV 视图函数urlpatterns = [url(r^user/$, views.user),url(r^user/add/$, views.user_add),url(r^user/edit/(\d+)/$, views.user_edit),url(r^user/del/(\d+)/$, views.user_del), ]传统的视图函数方式,API接口太多,难以维护。C…...

    2024/4/17 12:14:06
  4. java压缩zip文件中文乱码问题

    --转自:http://riching.iteye.com/blog/579634 用java来打包文件生成压缩文件,有两个地方会出现乱码 1、内容的中文乱码问题,这个问题网上很多人给出了解决方法,两种:修改sun的源码;使用开源的类库org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,…...

    2024/4/17 12:13:19
  5. 安装系统时出现-安装程序无法创建新的系统分区,也无法定位现有的系统分区,解决方法

    使用光盘安装系统,结果格式化C盘后,正准备装系统了,突然弹出“安装程序无法创建新的系统分区,也无法定位现有的系统分区”,就好像下图所示:看到这种情况,解决办法,具体步骤如下:1,准备好一个4G或者更大容量的U盘,用U大师把U盘制作成启动盘,重启电脑设置U盘为第一启…...

    2024/4/17 12:13:48
  6. python2 urlencod urldecode

    import urllib value = {: 三生三世} data = urllib.urlencode(value) print data 打印 %E4%B8%89%E7%94%9F%E4%B8%89%E4%B8%96print urllib.unquote(%E4%B8%89%E7%94%9F%E4%B8%89%E4%B8%96) 打印 三生三世希望能交流更多技术,关注小白的微信公众号吧。...

    2024/4/17 12:13:48
  7. 用ZipInputStream和ZipOutputStream实现文件及文件夹的压缩解压

    主要是运用ZipInputStream和ZipOutputStream实现 当中要注意,在文件解压时,ZipEntry中的名字是相对路径 File的方法createNewFile()只能在存在的目录下创建文件,所以在有多层目录时,先要mkdirs来创建目录,然后创建文件 代码如下 import java.io.*; import java.util.zip.*;…...

    2024/4/17 12:13:18
  8. 树莓派FM广播点歌系统

    简介 前段时间有人发贴说用树莓派可以发射FM收音机信号, 于是便整来玩玩,发现效果还不错,于是想扩充一下功能。 网上实现的FM发射功能是有局限性的: 只能播放wav格式文件,并且wav文件必须是16 bit 22.5kHz Mono格式的。 只支持播放本地音频文件,或者使用-从终端读取音频 …...

    2024/4/17 12:14:06
  9. vue-admin-template笔记(四)

    文章目录Vue学习笔记(四)treetable总结参考 Vue学习笔记(四)学习vue-admin-template https://github.com/PanJiaChen/vue-admin-template上一篇中分析了vue-admin-template的入口逻辑,包括main.js, App.vue, router。这篇根据router来分析下其他的页面。 下面是一部分路由…...

    2024/4/17 12:14:06
  10. AS3 深度拷贝对象的构造函数带参数

    关于AS3的深度拷贝, 网站有不少的的文章介绍. 我在EncryptZip项目中也用到了, 由于ZipEntry 有自己的构造函数, 在copier.readObject()处得到了参数个数不匹配错误(ArgumentError: Error #1063), 所以查找了相关资料, 然而最终也没有找到一个好的解决方案. 资料显示:如果不使…...

    2024/4/14 20:33:42
  11. C# 汉字 转 拼音 G2312编码

    using System;using System.IO;using System.Text;namespace WindowsApplication5{ /// <summary> /// ConvertHzToPz_Gb2312 的摘要说明。 /// </summary> public class ConvertHzToPz_Gb2312 { public ConvertHzToPz_Gb2312() { } #region //gb2312中的…...

    2024/4/13 2:02:57
  12. 二维码解析成链接 二维码解码

    左侧上传二维码就可以进行解析,右边会自动生成网址链接, 点击去解析...

    2024/4/17 12:14:18
  13. 文件夹解压缩问题 出错求解

    源代码如下:求各位大牛帮忙看看哪出错了import java.io.File ;import java.io.OutputStream ;import java.io.InputStream ;import java.util.zip.ZipEntry ;import java.util.zip.ZipFile ;import java.util.zip.ZipInputStream ;import java.io.FileInputStream ;import java…...

    2024/4/17 12:13:12
  14. 为java程序制作exe

    将java程序制作成Windows下的安装需要完成如下步骤: 把程序的class文件打包成Jar文件把jar文件转成exe精简JRE将整个程序(包含jre)打包成安装包使用exe4j将jar文件转成exe exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论这些应用是用于…...

    2024/4/17 12:15:25
  15. vueadmin-template应用1:安装入门

    vueadmin-template模板使用目前是比较流行的,它是在elementui基础上再次封装的。github地址:https://github.com/PanJiaChen/vue-admin-template1、安装在GitHub上https://github.com/PanJiaChen/vue-admin-template下载,下载完之后我们把名称修改一下为自己的名称,然后进行…...

    2024/4/18 22:26:20
  16. 小程序入门

    小程序是什么? 小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。 小程序并非凭空冒出来的一个概念。当微信中的 WebView 逐渐成为移动 Web 的一个重要入口时,微信就有相关的 JS API 了 小程序与普通网页开发的区别 小程…...

    2024/4/17 12:13:54
  17. bat脚本批量静默安装程序

    1、你最关心的如何静默安装“/q” 用于安装程序时可以静默安装start /wait %%i /q其中“/wait”是等上一个程序执行结束后再接续执行下一个2、正文开始用bat脚本自动安装程序,部署一些环境顺便学习了bat脚本,在这记录一下,方便以后维护、开发@echo off @mode con lines=40 c…...

    2024/4/17 12:13:49
  18. javascript 的URL 编码 和 解码 的几种方法 以及比较

    当url中有中文时为了不出现乱码需要为URL编码方法如下:URL编码: bodyEncode.value = encodeURI(document.all.keyword.value)URL解码: body.value = decodeURI(bodyEncode.value) 不只是这一种方法: javascript 常用的编码格式有:escape(), encodeURL(), encodeURIComponent()…...

    2024/4/17 12:14:06
  19. Django 自动生成api接口文档

    Django 自动生成api接口文档安装第三方包配置接口路径在serializers.py文件设置备注用浏览器打开api接口文档页面: 安装第三方包 pip install coreapi配置接口路径 from rest_framework.documentation import include_docs_urlsurlpatterns = [url(r^admin/, admin.site.urls)…...

    2024/4/11 13:51:42
  20. Java直接遍历并读取zip压缩文件的内容以及错误处理

    有一个项目需要从压缩包中读取数据,然后处理数据。刚开始想的是解压缩然后再读取。后又找到了个直接读取的。主要是用到了ZipEntry。多个压缩包嵌套也可以这样读取,思路是将压缩包里的压缩包解压出来。直接上代码:/** * Licensed to the Apache Software Foundation (ASF) u…...

    2024/4/17 12:14:13

最新文章

  1. General error during semantic analysis: Unsupported class file major version 61

    执行 ./gradlew publishToMavenLocal 报错 General error during semantic analysis: Unsupported class file major version 61 原因 升级了环境变量中Java版本 为17 解决方案 降级Java版本 或者升级脚本版本 参考 https://stackoverflow.com/questions/70632741/android-s…...

    2024/4/19 7:37:36
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. WPS二次开发专题:如何获取应用签名SHA256值

    作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在申请WPS SDK授权版时候需要开发者提供应用包名和签…...

    2024/4/15 22:57:36
  4. DDIM,多样性与运行效率之间的trade off

    DDPM的重大缺陷在于其在反向扩散的过程中需要逐步从 x t x_t xt​倒推到 x 0 x_0 x0​&#xff0c;因此其推理速度非常缓慢。相反&#xff0c;DDPM的训练过程是很快的&#xff0c;可以直接根据 x 0 x_0 x0​到 x t x_t xt​添加的高斯噪声 ϵ \epsilon ϵ完成一次训练。 为了解…...

    2024/4/18 20:00:54
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/18 0:33:31
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/18 22:36:36
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/18 9:45:31
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/17 2:33:17
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/17 7:50:46
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/18 3:56:01
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/18 3:56:04
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/18 3:55:30
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/18 3:55:54
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/18 3:55:45
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/17 21:50:30
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/15 13:53:08
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/15 9:16:52
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/18 9:24:29
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/18 3:56:18
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/18 3:55:57
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/18 3:55:50
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/15 23:28:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/18 3:56:20
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/18 3:56:11
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57