多平台统一管理软件接口,如何实现多平台统一管理软件接口
304
2023-04-20
本文目录一览:
基于webservice开发第三方应用程序,第三方API属于rest接口,而开发过程中难免需要测试,于是寻找测试rest接口的工具,现在主要用两种常用的工具:restclient和soupUI
一、使用restclient测试rest接口
RESTClient是一个用于测试RESTful Web services的Java客户端。
二、使用soapUI测试rest接口
虽然soapUI看上去好像是测试soap接口的,其实用它来测试rest接口未尝不可。
说明:目前只有test/xml格式成功实现,其他格式待探索。
soapUI由于目前消息体只有test/xml,multipart/form-data,application/xml,这三个选项,而在restclient工具中有几十种消息体格式,所以soapUI的使用还待进一步研究。
目前以合同添加接口为例
地址:http://adsettlement.test.360buy.com/rest/contractinfo.action
消息体类型是:text/xml,content-type=text/xml和charset=utf-8
方法是:POST
消息体:
<ContractInfo
<adsContractState0</adsContractState
<applyNo26</applyNo
<contractAmount550000</contractAmount
<contractBeginTime2012-08-13T10:55:04.336+08:00</contractBeginTime
<contractEndTime2013-08-13T10:55:04.336+08:00</contractEndTime
<contractNo20120026</contractNo
<createTime2012-08-13T10:55:04.336+08:00</createTime
<departmentNo0</departmentNo
<depositAmount120000</depositAmount
<hasDeposit1</hasDeposit
<isFrameContract0</isFrameContract
<invoiceType0</invoiceType
<isHasFrameContract0</isHasFrameContract
<isUpdatedContract0</isUpdatedContract
<plan_id0000026</plan_id
<plan_namepk</plan_name
<projectNo20120026</projectNo
<salesmanName赵玉梅</salesmanName
<settlementContractState1</settlementContractState
<AdsInfo
<parta_no7</parta_no
<parta_namezymtest7</parta_name
<partb_no14</partb_no
<partb_name京东商城</partb_name
<ads_amount280000</ads_amount
<has_deposit1</has_deposit
<deposit_amount90000</deposit_amount
<pay_account_deadline2012-10-30</pay_account_deadline
<last_charge_time2012-10-30</last_charge_time
</AdsInfo
<AdsInfo
<parta_no8</parta_no
<parta_namezymtest8</parta_name
<partb_no14</partb_no
<partb_name京东商城</partb_name
<ads_amount220000</ads_amount
<has_deposit1</has_deposit
<deposit_amount40000</deposit_amount
<pay_account_deadline2012-09-30</pay_account_deadline
<last_charge_time2012-9-30</last_charge_time
</AdsInfo
</ContractInfo
备注:其中<adsinfo可以增加,增加整个list即可
操作步骤
1、打开soapUI,创建工程
如图,右键,点击New soapUI Project
2、弹出创建工程窗口
在project name中输入工程名称,如Test,rest 接口勾选Add REST Service(这个必须勾选),点击“OK”按钮
3、弹出创建新rest服务页面,输入接口的域名地址,勾选opens dialog to create a REST Resource,点击“OK”按钮
4、弹出New REST Resource窗口,输入名称输入resource URL,点击“OK”按钮
5、弹出 New REST Method窗口,输入方法名称,选择API方法,点击“OK”按钮
6、创建请求成功,request请求页面如下
7、选择消息体格式,输入认证密码,输入消息体:
8、执行,查看执行结果:
9、在outline界面可以修改参数:
记录一下SpringBoot的RestApi接口的单元测试
1.使用的junit单元测试框架,所以需要加入依赖。
2.如果是jar项目dubbo接口rest服务怎么测试,就在单元测试的类上标注下面两个注解。
3.如果是web项目dubbo接口rest服务怎么测试,则还需要添加下面这个注解。
4.因为测试的是rest接口,所以,需要引入下面的请求发送工具(其dubbo接口rest服务怎么测试他的也可以)。
5.因为是针对本项目,所以通常还会添加一个属性,和一个方法。
6.这样的话,当需要编写单元测试的时候,只要直接继承该类即可。
spring 集成测试中 对mock 的集成实在是太棒了!但是使用请注意一下3个条件。
junit 必须使用4.9以上
同时您的框架必须是用spring mvc
spring 3.2以上才完美支持
目前使用spring MVC 取代struts2 的很多,spring MVC 的各种灵活让人无比销魂!所以使用spring MVC吧!
以前在对接口(主要是java服务端提供的接口(一般是:webService,restful))进行测试的中 一般用以下俩种方法。测试流程如图:
1 直接使用httpClient
这方法各种麻烦
2 使用Spring 提供的RestTemplate
错误不好跟踪,必须开着服务器
使用mockMVC都不是问题了看使用实例:
使用事例如下:父类
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.context.WebApplicationContext;
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:applicationContext.xml",
"classpath:xxxx-servlet.xml" })
public class AbstractContextControllerTests {
@Autowired
protected WebApplicationContext wac;
}
子类:
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import com.conlect.oatos.dto.status.RESTurl;
import com.qycloud.oatos.server.service.PersonalDiskService;
//这个必须使用junit4.9以上才有。
@RunWith(SpringJUnit4ClassRunner.class)
public class PersonalDiskMockTests extends AbstractContextControllerTests {
private static String URI = RESTurl.searchPersonalFile;
private MockMvc mockMvc;
private String json ="{\"entId\":1234,\"userId\":1235,\"key\":\"new\"}";
@Autowired
private PersonalDiskService personalDiskService;
@Before
public void setup() {
//this.mockMvc = webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build();
this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService).build();
}
@Test
public void readJson() throws Exception {
this.mockMvc.perform(
post(URI, "json").characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON)
.content(json.getBytes()))
.andExpect(content().string("Read from JSON: JavaBean {foo=[bar], fruit=[apple]}")
);
}
上面是简单的例子,实际使用起来可以稍做修改。记得导入spring -test jar 包。无需额外配置(是不是很方便!)
当然和junit 的assert 一起用的话效果更好。下面贴点例子。copy就能跑。
Java代码
package com.qycloud.oatos.server.test.mockmvcTest;
import static org.junit.Assert.fail;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import com.conlect.oatos.dto.status.CommConstants;
import com.conlect.oatos.dto.status.ErrorType;
import com.conlect.oatos.http.PojoMapper;
public class MockUtil {
/**
* mock
*
* @param uri
* @param json
* @return
* @throws UnsupportedEncodingException
* @throws Exception
*/
public static String mock(MockMvc mvc, String uri, String json)
throws UnsupportedEncodingException, Exception {
return mvc
.perform(
post(uri, "json").characterEncoding("UTF-8")
.contentType(MediaType.APPLICATION_JSON)
.content(json.getBytes())).andReturn()
.getResponse().getContentAsString();
}
/**
*
* @param re 返回值
* @param object 要转换的对象
* @param testName 当前测试的对象
*/
public static <T void check(String re, Class<T object,String testName) {
System.out.println(re);
if (ErrorType.error500.toString().equals(re)) {
System.out.println("-----该接口测试失败:-----"
+ testName);
fail(re);
} else if (CommConstants.OK_MARK.toString().equals(re)) {
System.out.println("-----该接口测试成功:-----"
+ testName);
}else{
System.out.println("-----re----- :"+re);
}
if (object != null) {
if (re.contains(":")) {
try {
T t = PojoMapper.fromJsonAsObject(re, object);
System.out.println("-----该接口测试成功:-----"
+ testName);
} catch (Exception e) {
System.out.println("-----该接口测试失败:-----"
+ testName);
fail(e.getMessage());
}
}
}
}
/**
* 初始化版本信息。每次调用测试用力之前首先更新版本信息
* @param mockMvc
* @param url
* @param fileId
* @param class1
* @return
* @throws UnsupportedEncodingException
* @throws Exception
*/
public static <T Long updateVersion(MockMvc mockMvc, String url,
Long fileId, Class<T class1) throws UnsupportedEncodingException, Exception {
String re = mock(mockMvc, url, fileId+"");
T dto = PojoMapper.fromJsonAsObject(re, class1);
Long version = Long.parseLong(dto.getClass().getMethod("getVersion").invoke(dto).toString());
System.out.println("version = "+version);
return version;
}
}
使用如下:
Java代码
@RunWith(SpringJUnit4ClassRunner.class)
public class PersonalDiskMockTests extends AbstractContextControllerTests {
private MockMvc mockMvc;
private static Long entId = 1234L;
private static Long adminId = 1235L;
@Autowired
private PersonalDiskService personalDiskService;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(personalDiskService)
.build();
}
/***
* pass
* 全局搜索企业文件
*
* @throws Exception
*/
@Test
public void searchPersonalFile() throws Exception {
SearchFileParamDTO sf = new SearchFileParamDTO();
sf.setEntId(entId);
sf.setKey("li");
sf.setUserId(adminId);
String json = PojoMapper.toJson(sf);
String re = MockUtil.mock(this.mockMvc, RESTurl.searchPersonalFile,
json);
MockUtil.check(re, SearchPersonalFilesDTO.class, "searchPersonalFile");
}
}
当然@setup里面是每个@test执行时都会执行一次的,所以有些需要每次都实例化的参数可以放进来
如下:
Java代码
@Autowired
private ShareDiskService shareDiskService;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.standaloneSetup(shareDiskService)
.build();
try {
initDatas();
} catch (Exception e) {
e.printStackTrace();
}
}
private void initDatas() throws UnsupportedEncodingException, Exception {
FileIdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,FileId,ShareFileDTO.class);
File2IdVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFileById,File2Id,ShareFileDTO.class);
oldPicFolderVersion = MockUtil.updateVersion(mockMvc,RESTurl.getShareFolderById,oldPicFolderId,ShareFolderDTO.class);
}
ok!基本使用大致如此,代码没有些注释,但是很简单,看懂是没问题的。权当抛砖引玉。希望大家加以指正!
1、InvokerInvocationHandler jdk动态代理
5、RegistryDirector返回Invokers
Router分为dubbo接口rest服务怎么测试:Script 脚本路由、Condition 条件路由
6、通过MockInvokersSelectordubbo接口rest服务怎么测试的route方法(getNormalInvokers)拿到能正常执行的invokers
8、当回到AbstractClusterInvoker后dubbo接口rest服务怎么测试,执行(默认FailoverClusterInvoker,根据配置的是,Failfast Cluster(快速失败) , Failsafe Cluster(失败安全) , Failback Cluster(失败自动恢复) , Forking Cluster(并行调用多个服务器,只要一个成功即返回) , Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错))doInvoker方法
9、FailoverClusterInvoker调用AbstractClusterInvoker的select方法
10、执行doSelect方法
11、调用AbstractLoadbalance的select方法
12、根据配置的负载均衡策略调用对应的(如RoundRobinLoadBalance)类的doSelect方法
13、返回invokers.get()方法
14、调用FailoverClusterInvoker的invoke方法
均继承自抽象类AbstractDirectory
Directory 获取 invoker 是从 methodInvokerMap 中获取的,主要都是读操作,那它的写操作是在什么时候写的呢?就是在回调方法 notify 的时候操作的,也就是注册中心有变化,则更新 methodInvokerMap 和 urlInvokerMap 的值
根据dubbo-admin配置的路由规则来过滤相关的invoker,当dubbo接口rest服务怎么测试我们对路由规则点击启用,就会触发 RegistryDirectory 类的 notify 方法。
notify方法调用refreshInvoker方法。
route方法的实现类为ConditionRoute 根据条件进行过滤
1、调用mathThen方法
2、调用matchCondition方法
3、调用isMatch判断
4、调用isMatchGlobPattern方法
集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是Dubbo Cluster集群的作用。
通过cluster来指定集群容错方式
其实就是应对出错情况采取的策略
用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非提供者挂了,再连另一台,自动开启延迟链接,以减少长接数
启动时服务提供者将当前进程启动时间注册到ZK;服务消费者发现该节点后计算服务启动时间(相对当前时间),在默认预热时间的前20%时间内,该节点权重始终固定为2,这样客户端的负载均衡器只会分发极少的请求至节点。
在预热时间之后的80%时间内,该节点权重将随着时间的推移而线性增长;待预热时间到期后,权重自动恢复为默认值100;负载均衡器的内核是一个标准的WLC算法模块,即加权最少连接算法;
如果某个节点Hang住或宕机,其权重会迅速自动调节降低,避免持续性影响;当节点下线时,服务端提前触发权重调节,重载默认权重至1并发布到注册中心,服务消费者将迅速感知到该事件;
服务提供者优雅下线步骤(注意这套逻辑仅在服务端执行)在ok.htm?down=true对应的controller中加入下列逻辑,注意要判断down是否为true,因为正常来说false表示启动验证而不是关机
服务者消费者配置
dubbo服务支持参数动态调整,例如动态调整权重,但dubbo实现方式较为特殊,并不是常规思路。
ServiceConfig类拿到对外提供服务的实际类ref,然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转换(javassistProxyFacory、JdkProxyFactory),接着要做Invoker转换到Export的过程
服务发布:本地暴露、远程暴露
为什么会有 本地暴露 和 远程暴露 呢?不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是 Provider ,又是 Consumer ,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有 本地暴露 服务的这个设计.从这里我们就知道这个两者的区别
1、spring启动,解析配置文件
2、创建dubbo标签解析器
3、解析dubbo标签
4、ServiceBean解析
5、容器创建完成,触发ContextRefrestEvent
6、export暴露服务
7、duExportUrls
8、doExportUrlsFor1Protocol
9、getInvoker
10、protocol.export
11、开启服务器 openServer()如nettyServer
12、注册服务到注册中心 registerProvider
Filter 在服务暴露前,做拦截器初始化,在加载所有拦截器时会过滤支队provider生效的数据。
可以。zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成 properties 对象方便使用。建立线程池,定时检测并连接注册中心,失败了就重连。
注册服务到zk其实就是在zk上创建临时节点,当节点下线或者down掉时,即会删除临时节点,从而使服务从可用列表中剔除。
持久节点
临时节点
1、export的时候进行zk订阅
2、设置监听回调的地址,回调给FailbackRegistry的notify
3、创建持久节点
4、设置对该节点的监听
5、更新新的服务信息,服务启动和节点更新回调,都会调用到这里
6、更新缓存文件
7、对比新旧信息是否有变化,有则重新暴露服务
高并发大业务量情况下,暂时屏蔽边缘业务
MockClusterInvoker
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。
关于dubbo接口rest服务怎么测试和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 dubbo接口rest服务怎么测试的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、dubbo接口rest服务怎么测试的信息别忘了在本站进行查找喔。版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~