HSF简单实现记录( 基于Ali-Tomcat 开发)
文章目录
声明
本文十分感谢:https://help.aliyun.com/document_detail/99943.html?spm=a2c4g.11186623.6.607.1e112385pAFx19
在文章的基础上,经过了测试。
注意
**
自己犯的错误总结:
自己犯的错误总结:
本地hosts必须配成127.0.0.1 不能使localhost
必须把注册中心安装在本地。
maven在idea中配置成自己修改了私服的maven地址
不行就重启idea,重启mac
生产者消费者只需要启动tomcat就能出现,不需要访问任何,如果出现不了往下看,可能是tomcat配置路径的问题,再不行就重启idea,重启mac
我自己之前配置过一次Alitomcat,这次下载又把原来的删掉了,所以这次的tomcat目录还是原来的tomcat目录,虽然名字一样,路径是对的,所以不能成功的显示在个人管理的消费者列表中,直到我重新配置了一次Alitomcat,一切正常了 **
提示:
运行方式就是下面的demo中的生产者和消费者都发布到一个tomcat中。然后运行idea中的tomcat即可。当然消费者可以访问localhost:8081/index.htm
成功页面:
Ali-Tomcat 概述
Ali-Tomcat 是 EDAS 中的服务运行时可依赖的一个容器,它主要集成了服务的发布、订阅、调用链追踪等一系列的核心功能。无论是开发环境还是运行时,您均可将应用程序发布在该容器中。
Pandora 是一个轻量级的隔离容器,也就是 taobao-hsf.sar。它用来隔离应用和中间件的依赖,也用来隔离中间件之间的依赖。EDAS 的 Pandora 中集成了服务发现、配置推送和调用链跟踪等各种中间件功能产品插件。您可以利用这些插件对 EDAS 应用进行服务监控、治理、跟踪、分析等全方位运维管理。
如您未使用过 HSF,请避免使用 Ali-Tomcat 来开发 EDAS 应用。
注意:在 EDAS 中,只有 WAR 形式的 Web 应用才能使用 Ali-Tomcat。
安装 Ali-Tomcat 和 Pandora 并配置开发环境
安装 Ali-Tomcat 和 Pandora
Ali-Tomcat 和 Pandora 为 EDAS 中的服务运行时所依赖的容器,主要集成了服务的发布、订阅、调用链追踪等一系列的核心功能,无论是开发环境还是运行时,均必须将应用程序发布在该容器中。
注意:请使用 JDK 1.7及以上版本。
下载 Ali-Tomcat,保存后解压至相应的目录(如:d:\work\tomcat\)。
下载 Pandora 容器,保存后将内容解压至上述保存的 Ali-Tomcat 的 deploy 目录(d:\work\tomcat\deploy)下。
查看 Pandora 容器的目录结构。
Linux 系统中,在相应路径下执行 tree -L 2 deploy/ 命令查看目录结构。
d:\work\tomcat > tree -L 2 deploy/
deploy/
└── taobao-hsf.sar
├── META-INF
├── lib
├── log.properties
├── plugins
├── sharedlib
└── version.properties
Windows 中,直接进入相应路径进行查看。
如果您在安装和使用 Ali-Tomcat 和 Pandora 过程中遇到问题,请参见 Ali-Tomcat 问题和 Pandora 问题进行定位、解决。
配置开发环境
您在本地开发应用时,需要使用 Eclipse 或 IntelliJ IDEA。本节将分别介绍如何配置 Eclipse 或 IntelliJ IDEA 开发环境。
配置 Eclipse 环境
配置 Eclipse 需要下载 Tomcat4E 插件,并存放在安装 Ali-Tomcat 时 Pandora 容器的保存路径中,配置之后开发者可以直接在 Eclipse 中发布、调试本地代码。具体步骤如下:
- 下载 Tomcat4E 插件,并解压至本地(如:d:\work\tomcat4e\)。
压缩包内容如下:
打开 Eclipse,在菜单栏中选择 Help > Install New Software。
在 Install 对话框中 Work with 区域右侧单击 Add,然后在弹出的 Add Repository 对话框中单击 Local。在弹出的对话框中选中已下载并解压的 Tomcat4E 插件的目录(d:\work\tomcat4e\)>,单击 OK。
返回 Install 对话框,单击 Select All,然后单击 Next。
后续还有几个步骤,按界面提示操作即可。安装完成后,Eclipse 需要重启,以使 Tomcant4E 插件生效。
重启 Eclipse。
重启后,在 Eclipse 菜单中选择 Run As > Run Configurations。
选择左侧导航选项中的 AliTomcat Webapp,单击上方的 New launch configuration 图标。
在弹出的界面中,选择 AliTomcat 页签,在 taobao-hsf.sar Location 区域单击 Browse,选择本地的 Pandora 路径,如:d:\work\tomcat\deploy\taobao-hsf.sar。
单击 Apply 或 Run,完成设置。
一个工程只需配置一次,下次可直接启动。
- 查看工程运行的打印信息,如果出现下图 Pandora Container 的相关信息,即说明 Eclipse 开发环境配置成功。
配置 IntelliJ IDEA 环境注意:目前仅支持 IDEA 商业版,社区版暂不支持。所以,请确保本地安装了商业版 IDEA。
运行 IntelliJ IDEA。
从菜单栏中选择 Run > Edit Configuration。
在 Run/Debug Configuration 页面左侧的导航栏中选择 Defaults > Tomcat Server > Local。
配置 AliTomcat。
在右侧页面单击 Server 页签,然后在 Application Server 区域单击 Configure。
在 Application Server 页面右上角单击 +,然后在 Tomcat Server 对话框中设置 Tomcat Home 和 Tomcat base directory 路径,单击 OK。
将 Tomcat Home 的路径设置为本地解压后的 Ali-Tomcat 路径,Tomcat base directory 可以自动使用该路径,无需再设置。
在 Application Server 区域的下拉菜单中,选择刚刚配置好的 Ali-Tomcat。
在 VM Options 区域的文本框中,设置 JVM 启动参数指向 Pandora 的路径,如:-Dpandora.location=d:\work\tomcat\deploy\taobao-hsf.sar
说明:d:\work\tomcat\deploy\taobao-hsf.sar 需要替换为在本地安装 Pandora 的实际路径。
- 单击 Apply 或 OK 完成配置。
配置轻量配置中心
轻量配置中心给开发者提供在开发、调试、测试的过程中的服务发现、注册和查询功能。此模块不属于 EDAS 正式环境中的服务,使用时请下载安装包进行安装。
在一个公司内部,通常只需要在一台机器上安装轻量配置中心服务,并在其他开发机器上绑定特定的 host 即可。具体安装和使用的步骤请参见下文。
下载轻量配置中心
确认环境是否达到要求。
正确配置环境变量 JAVA_HOME,指向一个 1.6 或 1.6 以上版本的 JDK。
确认 8080 和 9600 端口未被使用。
由于启动 EDAS 配置中心将会占用此台机器的 8080 和 9600 端口,因此推荐您找一台专门的机器启动 EDAS 配置中心,比如某台测试机器。如果您是在同一台机器上进行测试,请将 Web 项目的端口修改为其它未被占用的端口。
下载 EDAS 配置中心安装包并解压。
如有需要,可以下载历史版本:
2018年10月版本
2018年01月版本
2017年08月版本
2017年07月版本
2017年03月版本
2016年12月版本
启动轻量配置中心
进入解压目录(edas-config-center),启动配置中心。
Windows 操作系统:请双击 startup.bat。
Unix 操作系统:请在当前目录下执行 sh startup.sh 命令。
配置 hosts
对于需要使用轻量配置中心的开发机器,请在本地 DNS(hosts 文件)中,将 jmenv.tbsite.net 域名指向启动了 EDAS 配置中心的机器 IP。
hosts 文件的路径如下:
Windows 操作系统:C:\Windows\System32\drivers\etc\hosts
Unix 操作系统:/etc/hosts
示例
如果您在 IP 为 192.168.1.100 的机器上面启动了 EDAS 配置中心,则所有开发者只需要在机器的 hosts 文件里加入如下一行即可。
192.168.1.100 jmenv.tbsite.net
结果验证
绑定轻量配置中心的 host 之后,打开浏览器,在地址栏输入 jmenv.tbsite.net:8080,回车。
即可看到轻量配置中心首页:
如果可以正常显示,说明轻量配置中心配置成功。
如果不能正常显示,请根据之前的步骤一步步排查问题所在。
如果您在配置轻量配置中心过程中遇到问题,请参见轻量配置中心问题进行定位、解决。
后续操作
为了免于搭建本地配置中心和微服务环境,EDAS 向开发者提供了 IDE 插件。通过一键开启IDE 插件的端云联调功能,即可将本地应用注册到 EDAS 云端注册中心,与云端服务进行通信。
请您参考 Eclipse 联调插件或 Intellij IDEA 联调插件进行安装使用。
使用 EDAS SDK 开发应用
下载 Demo 工程
本章中介绍的代码均可以通过官方 Demo 获取。
下载 Demo 工程。
解压下载的压缩包,可以看到carshop文件夹,里面包含 itemcenter-api,itemcenter 和 detail 三个 Maven 工程文件夹。
- itemcenter-api:提供接口定义
- itemcenter:生产者服务
- detail:消费者服务
定义服务接口
HSF 服务基于接口实现,当接口定义好之后,生产者将使用该接口实现具体的服务,消费者也是基于此接口去订阅服务。
在 Demo 的itemcenter-api工程中,定义了一个服务接口 com.alibaba.edas.carshop.itemcenter.ItemService,内容如下:
public interface ItemService {
public Item getItemById(long id);
public Item getItemByName(String name);
}
该服务接口将提供两个方法:getItemById 与 getItemByName。
开发生产者服务
生产者将实现服务接口以提供具体服务。同时,由于使用了 Spring 框架,还需要在 .xml 文件中配置服务属性。
说明:Demo 工程中的 itemcenter 文件夹为生产者服务的示例代码。
实现服务接口
可以参考ItemServiceImpl.java文件中的示例:
可以参考ItemServiceImpl.java文件中的示例:
package com.alibaba.edas.carshop.itemcenter;
public class ItemServiceImpl implements ItemService {
@Override
public Item getItemById( long id ) {
Item car = new Item();
car.setItemId( 1l );
car.setItemName( "Mercedes Benz" );
return car;
}
@Override
public Item getItemByName( String name ) {
Item car = new Item();
car.setItemId( 1l );
car.setItemName( "Mercedes Benz" );
return car;
}
}
配置服务属性
上述示例主要实现了 com.alibaba.edas.carshop.itemcenter.ItemService,并在两个方法中返回了一个 Item 对象。代码开发完成之后,除了在 web.xml 中进行必要的常规配置,您还需要增加相应的 Maven 依赖,同时在 Spring 配置文件使用 标签注册并发布该服务。具体内容如下:
在pom.xml中添加如下 Maven 依赖:
<dependencies>
<!-- 添加 servlet 的依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- 添加 Spring 的依赖 -->
<dependency>
<groupId>com.alibaba.edas.carshop</groupId>
<artifactId>itemcenter-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<!-- 添加服务接口的依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>2.5.6(及其以上版本)</version>
</dependency>
<!-- 添加 edas-sdk 的依赖 -->
<dependency>
<groupId>com.alibaba.edas</groupId>
<artifactId>edas-sdk</artifactId>
<version>1.5.0</version>
</dependency>
</dependencies>
在 hsf-provider-beans.xml 文件中增加 Spring 关于 HSF 服务的配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hsf="http://www.taobao.com/hsf"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.taobao.com/hsf
http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
<!-- 定义该服务的具体实现 -->
<bean id="itemService" class="com.alibaba.edas.carshop.itemcenter.ItemServiceImpl" />
<!-- 用 hsf:provider 标签表明提供一个服务生产者 -->
<hsf:provider id=“itemServiceProvider"
<!-- 用 interface 属性说明该服务为此类的一个实现 -->
interface=“com.alibaba.edas.carshop.itemcenter.ItemService"
<!-- 此服务具体实现的 Spring 对象 -->
ref=“itemService"
<!-- 发布该服务的版本号,可任意指定,默认为 1.0.0 -->
version=“1.0.0"
</hsf:provider>
</beans>
上面的示例为基本配置,您也可以根据您的实际需求,参考下面的生产者服务属性列表,增加其它配置。
生产者服务属性列表
- | - |
---|---|
interface | 必须配置,类型为 [String],为服务对外提供的接口。 |
version | 可选配置,类型为 [String],含义为服务的版本,默认为 1.0.0。 |
clientTimeout | 该配置对接口中的所有方法生效,但是如果客户端通过 methodSpecials 属性对某方法配置了超时时间,则该方法的超时时间以客户端配置为准。其他方法不受影响,还是以服务端配置为准。 |
serializeType | 可选配置,类型为 [String(hessian|java)],含义为序列化类型,默认为 hessian。 |
corePoolSize | 单独针对这个服务设置核心线程池,从公用线程池中划分出来。 |
maxPoolSize | 单独针对这个服务设置线程池,从公用线程池中划分出来。 |
enableTXC | 开启分布式事务 GTS。 |
ref | 必须配置,类型为 [ref],为需要发布为 HSF 服务的 Spring Bean ID。 |
methodSpecials | 可选配置,用于为方法单独配置超时时间(单位 ms),这样接口中的方法可以采用不同的超时时间。该配置优先级高于上面的 clientTimeout 的超时配置,低于客户端的 methodSpecials 配置。 |
生产者服务属性配置示例
<bean id="impl" class="com.taobao.edas.service.impl.SimpleServiceImpl" />
<hsf:provider id="simpleService" interface="com.taobao.edas.service.SimpleService"
ref="impl" version="1.0.1" clientTimeout="3000" enableTXC="true"
serializeType="hessian">
<hsf:methodSpecials>
<hsf:methodSpecial name="sum" timeout="2000" />
</hsf:methodSpecials>
</hsf:provider>
开发消费者服务
消费者订阅服务从代码编写的角度分为两个部分。
Spring 的配置文件使用标签hsf:consumer/定义好一个 Bean。
在使用的时候从 Spring 的 context 中将 Bean 取出来。
说明:Demo 工程中的 detail 文件夹为消费者服务的示例代码。
配置服务属性
与生产者一样,消费者的服务属性配置分为 Maven 依赖配置与 Spring 的配置。
- 在pom.xml文件中添加 Maven 依赖。
Maven 依赖配置与生产者相同,详情请参见开发生产者服务的配置服务属性。
- 在 hsf-consumer-beans.xml 文件中添加 Spring 关于 HSF 服务的配置。
增加消费者的定义,HSF 框架将根据该配置文件去服务中心订阅所需的服务。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:hsf="http://www.taobao.com/hsf"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.taobao.com/hsf
http://www.taobao.com/hsf/hsf.xsd" default-autowire="byName">
<!-- 消费一个服务示例 -->
<hsf:consumer
<!-- Bean ID,在代码中可根据此 ID 进行注入从而获取 consumer 对象 -->
id="item"
<!-- 服务名,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
interface="com.alibaba.edas.carshop.itemcenter.ItemService"
<!-- 版本号,与服务提供者的相应配置对应,HSF 将根据 interface + version 查询并订阅所需服务 -->
version="1.0.0"
</hsf:consumer>
</beans>
配置服务调用
可以参考StartListener.java文件中的示例:
public class StartListener implements ServletContextListener{
@Override
public void contextInitialized( ServletContextEvent sce ) {
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext( sce.getServletContext() );
// 根据 Spring 配置中的 Bean ID “item” 获取订阅到的服务
final ItemService itemService = ( ItemService ) ctx.getBean( "item" );
……
// 调用服务 ItemService 的 getItemById 方法
System.out.println( itemService.getItemById( 1111 ) );
// 调用服务 ItemService 的 getItemByName 方法
System.out.println( itemService.getItemByName( "myname is le" ) );
……
}
}
上面的示例中为基本配置,您也可以根据您的实际需求,参考下面的服务属性列表,增加其它配置。
消费者服务属性列表
- | - |
---|---|
interface | 必须配置,类型为 [String],为需要调用的服务的接口。 |
version | 可选配置,类型为 [String],为需要调用的服务的版本,默认为1.0.0。 |
methodSpecials | 可选配置,为方法单独配置超时时间(单位 ms)。这样接口中的方法可以采用不同的超时时间,该配置优先级高于服务端的超时配置。 |
target | 主要用于单元测试环境和开发环境中,手动地指定服务提供端的地址。如果不想通过此方式,而是通过配置中心推送的目标服务地址信息来指定服务端地址,可以在消费者端指定 -Dhsf.run.mode=0。 |
connectionNum | 可选配置,为支持设置连接到 server 连接数,默认为1。在小数据传输,要求低延迟的情况下设置多一些,会提升 TPS。 |
clientTimeout | 客户端统一设置接口中所有方法的超时时间(单位 ms)。超时时间设置优先级由高到低是:客户端 methodSpecials,客户端接口级别,服务端 methodSpecials,服务端接口级别 。 |
asyncallMethods | 可选配置,类型为 [List],设置调用此服务时需要采用异步调用的方法名列表以及异步调用的方式。默认为空集合,即所有方法都采用同步调用。 |
maxWaitTimeForCsAddress | 配置该参数,目的是当服务进行订阅时,会在该参数指定时间内,阻塞线程等待地址推送,避免调用该服务时因为地址为空而出现地址找不到的情况。若超过该参数指定时间,地址还是没有推送,线程将不再等待,继续初始化后续内容。注意,在应用初始化时,需要调用某个服务时才使用该参数。如果不需要调用其它服务,请勿使用该参数,会延长启动启动时间。 |
消费者服务属性配置示例
<hsf:consumer id="service" interface="com.taobao.edas.service.SimpleService"
version="1.1.0" clientTimeout="3000"
target="10.1.6.57:12200?_TIMEOUT=1000" maxWaitTimeForCsAddress="5000">
<hsf:methodSpecials>
<hsf:methodSpecial name="sum" timeout="2000" ></hsf:methodSpecial>
</hsf:methodSpecials>
</hsf:consumer>
发布服务
完成代码、接口开发和服务配置后,在 Eclipse 或 IDEA 中,可直接以 Ali-Tomcat 运行该服务(具体请参照文档开发工具准备中的配置 Eclipse 开发环境和配置 IDEA 开发环境。
在开发环境配置时,有一些额外 JVM 启动参数来改变 HSF 的行为,具体如下:
- | - |
---|---|
-Dhsf.server.port | 指定 HSF 的启动服务绑定端口,默认值为 12200。 |
-Dhsf.serializer | 指定 HSF 的序列化方式,默认值为 hessian。 |
-Dhsf.server.max.poolsize | 指定 HSF 的服务端最大线程池大小,默认值为 600。 |
-Dhsf.server.min.poolsize | 指定 HSF 的服务端最小线程池大小。默认值为 50。 |
-DHSF_SERVER_PUB_HOST | 指定对外暴露的 IP,如果不配置,使用 -Dhsf.server.ip 的值。 |
-DHSF_SERVER_PUB_PORT | 指定对外暴露的端口,该端口必须在本机被监听,并对外开放了访问授权,默认使用 -Dhsf.server.port 的配置,如果 -Dhsf.server.port 没有配置,默认使用 |
开发环境查询 HSF 服务
在开发调试的过程中,如果您的服务是通过轻量配置中心进行服务注册与发现,就可以通过 EDAS 控制台查询某个应用提供或调用的服务。
假设您在一台 IP 为 192.168.1.100 的机器上启动了 EDAS 配置中心。
进入 http://192.168.1.100:8080/ 。
在左侧菜单栏单击服务列表,输入服务名、服务组名或者 IP 地址进行搜索,查看对应的服务提供者以及服务调用者。
注意:配置中心启动之后默认选择第一块网卡地址做为服务发现的地址,如果开发者所在的机器有多块网卡的情况,可设置启动脚本中的 SERVER_IP 变量进行显式的地址绑定
HSF简单实现记录( 基于Ali-Tomcat 开发)的更多相关文章
- HSF简单实现记录(基于 Pandora Boot 开发)
文章目录 声明 注意 安装轻量配置中心 启动轻量配置中心 配置 hosts 结果验证 开发工具准备 在 Maven 中配置 EDAS 的私服地址 验证配置是否成功 开发 demo下载 服务注册与发现 ...
- 如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读<<黑客与画家>> 有感
上一次博文发文时间是2016.1.15,7个月已经过去了.最近读了一本<>的书,对我触动挺大的!里面有关于技术趋势的探讨,也有关于人生和财富的思考! 开始更新iOS122的文章的初衷是,聚 ...
- tomcat开发远程调试端口以及利用eclipse进行远程调试
一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...
- 极其简单的搭建eclipse的android开发环境
这篇博客是关于如何搭建eclipse的android开发环境, 与网上的其他博客不同,我的方法比他们简单的多,所 以推荐给大家. 搭建eclipse的android开发环境步骤: 1.配置JDK(Ja ...
- 极其简单的使用基于gulp和sass前端工作流
简单的记录自己如何在实际工作中使用gulp和sass的.我的原则是,小而美! gulp与sass介绍 gulp 什么是gulp?和Grunt一样,是一种任务管理工具:和Grunt又不一样,gulp是一 ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 基于NSIS脚本开发的安装程序制作软件:易量安装
原文 基于NSIS脚本开发的安装程序制作软件:易量安装 前几天“萝卜”给我推荐了一款安装程序制作工具——易量安装. 易量安装是一款安装程序制作软件,基于著名的NSIS(Nullsoft Scripta ...
- 你也可以玩转Skype -- 基于Skype API开发外壳程序入门
原文:你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式.你,值得拥有! :) ...
- KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情
KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...
随机推荐
- 【基础】Pipeline
1. 参考的优秀文章 Request/Response protocols and RTT 2. 来源 原来,系统中一个树结构的数据来源是Redis,由于数据增多.业务复杂,查询速度并不快.究其原因, ...
- Vlan的相关知识点收纳
Q.思科Vlan的上限个数是多少? VLAN的范围:根据平台和软件版本不同,Cisco交换机最多支持4096个VLAN.VLAN号共有4096个,0-4095 0,4095:这两个号保留,仅限系 ...
- 安全检测及分析神器—AppScan使用教程
最近项目准备验收,所以最近在做项目验收的准备工作:我们公司规定,项目的安全检测必须通过才能进行项目验收:公司的安全部门用的检测软件就是大名鼎鼎的IBM Rational Appscan;在教由安全部门 ...
- PC 端响应式布局
前言:PC端 电脑显示器的尺寸种类还是很多的,台式电脑和笔记本电脑尺寸相差就更明显,所以响应式布局还是很重要的,甚至是必须要考虑的. 响应式的页面好不好,在后管平台上很明显.因为后管平台,一般是全屏显 ...
- Chrome 调试跨域问题解决方案之插件篇
跨域,就是A域名下的js,想请求B域名下的接口数据.跨域,只存在于浏览器端.App和小程序不存在跨域问题.跨域,分浏览器策略和服务器策略. 如果服务器配置了允许跨域,那就没有跨域问题 如果uni-ap ...
- MDK中问题:warning : type qualifier is meaningless on cast type return 的解决
在MDK编译代码时,有时会出现这样的警告, warning : type qualifier is meaningless on cast type return 在MDK中,作如下设置: 即添加 : ...
- Codeforce 1182B Plus from Picture
题目链接:http://codeforces.com/problemset/problem/1182/B 题意:检查图中 * 形成的是否是唯一的十字. 思路:dfs找到十字的中心,反向消除十字,最后检 ...
- NIO 源码分析(05) Channel 源码分析
目录 一.Channel 类图 二.begin 和 close 是什么 2.1 AbstractInterruptibleChannel 中的 begin 和 close 2.2 Selector 中 ...
- LNMP之PHP
PHP LNMP环境下的PHP安装 CGI指的是通用网关接口,为HTTP服务器与其他机器上的程序服务通信交流的一种工具,性能差,所以被淘汰了. FastCGI,是一个可以伸缩.高速的在HTTP服务器和 ...
- PHP之如何编写一个Vue的API后台(一)
首先我们先建立文件的结构 如下图: components - 存放所有的全局方法,比如:autoplay的函数 lib - 所有第三方的方法 比如:DBTool:数据库的方法 logs - 日志 ...