Commit 3ade14fe by huluobin

# 百伦api README.md 更新

parent 824a8392
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([$class : 'GitSCM',
branches : [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url : GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('编译') {
steps {
sh 'mvn clean package'
}
}
stage('推送到 CODING Maven 制品库') {
steps {
echo '发布中...'
sh 'mvn deploy -DskipTests'
echo '发布完成.'
}
}
}
environment {
CODING_MAVEN_REPO_ID = "${CCI_CURRENT_TEAM}-${PROJECT_NAME}-${MAVEN_REPO_NAME}"
CODING_MAVEN_REPO_URL = "${CCI_CURRENT_WEB_PROTOCOL}://${CCI_CURRENT_TEAM}-maven.pkg.${CCI_CURRENT_DOMAIN}/repository/${PROJECT_NAME}/${MAVEN_REPO_NAME}/"
}
}
### 百伦api
## 百伦api
封装所有Java项目需要用到的第三方服务和内部异构(.NET)服务的接口调用
封装所有对外的http接口成方法调用,以二方库的形式提供能力,不用在每个项目重复写。
每个方法都要经过单元测试
### 如何使用
- 继承parent
```xml
<parent>
<groupId>com.bailuntec</groupId>
<artifactId>bailuntec-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
```
#### bailuntec
百伦内部 .net提供的api
- 添加依赖
```xml
<dependency>
<groupId>com.bailuntec</groupId>
<artifactId>bailuntec-api</artifactId>
</dependency>
```
##### oms订单系统
订单系统开发api
#####
- 非spring环境
```java
@Slf4j
class PamsApiTestNoSpring {
#### amazon
亚马逊开放api
#### ebay
ebay开放api
@Test
void getAccountToken() {
PamsApi pamsApi = FeignUtil.getInstance(PamsApi.class);
PamsResult<List<GetAccountTokenResp>> result = pamsApi.getAccountToken();
log.info(JsonUtilByFsJson.beanToJson(result));
}
}
```
- springboot环境
```
@ActiveProfiles(value = "test")
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
class PamsApiTest {
@Resource
PamsApi pamsApi;
@Test
void getAccountToken() {
PamsResult<List<GetAccountTokenResp>> result = pamsApi.getAccountToken();
log.info(JsonUtilByFsJson.beanToJson(result));
}
}
```
### 技术栈
- pring-cloud-starter-openfeign 通过feign封装Api,以二方库形式提供能力,消费方通过接口方法调用
- spring-cloud-starter-netflix-hystrix hystrix 提供熔断能力
- jackson spring默认jackson作为序列化框架
### 项目目录
```
└── com
└── bailuntec
└── api
├── amazon //亚马逊开放api feign抽象
├── bailuntec //百伦内部api调用feign抽象
│   ├── crm //crm系统接口
│   ├── cw //财务系统接口
│   ├── fee //费用系统接口
│   ├── mj //美甲系统
│   ├── mjcg //美甲采购
│   ├── oa //oa系统接口
│   ├── oms //订单系统接口
│   ├── pams //pams
│   ├── pps //刊登系统接口
│   ├── purchase //采购系统接口
│   ├── sso //单点登录接口
│   ├── wms //库存接口
│   └── www //百伦其他
├── config //系统配置
├── ebay //ebay开放api
└── wish //
```
### 如何开发
#### 包命名
com.xxx.request: xxx是公司名,该包存放方法入参定义。类命名为 **Req
com.xxx.request: xxx是公司名,该包存放方法出参定义。类命名为 **Resp
com.xxx.api: xxx是公司名,该包存放方法定义。~~
#### 创建feign接口
- 创建SpringMvc风格的接口
- 注解@FeignClient 指定name 和地址url
- @GetMapping @PostMapping 用法同springMvc
- @RequestBody @RequestParam @PathVariable 用法同springMvc
#### 熔断
- 创建熔断类继承feign接口实现熔断逻辑
- 熔断配置 @FeignClient fallback = 熔断类
```java
@FeignClient(name = "sso", url = "http://sso.bailuntec.com/", fallback = SsoApi.SsoApiFallback.class)
public interface SsoApi {
/**
* <p>调用公司信息接口</p>
*
* @return 公司信息
*/
@GetMapping("/GetCompanys")
SsoResult<List<GetCompanysResp>> getCompanys();
/**
* <p>调用公司员工信息接口</p>
*
* @return 公司员工信息
*/
@GetMapping("/GetUserByCompany")
SsoResult<GetUserByCompanyResp> getUserByCompany();
@Component
class SsoApiFallback implements SsoApi {
@Override
public SsoResult<List<GetCompanysResp>> getCompanys() {
return new SsoResult<>();
}
@Override
public SsoResult<GetUserByCompanyResp> getUserByCompany() {
return new SsoResult<>();
}
}
}
```
#### 命名规范
- 入参定义:方法名+Req 。
- 出参定义:方法名+Resp。
- api定义接口按照项目接口分类
#### 注意事项
- @RequestParam 需要显示指定value
- 有一些三方服务的api返回的不是规范json不能直接序列化 需要用string接受然后再代码转换。
- 该类库只是对异构内部服务(主要是.Net)和三方接口的外部接口调用抽象,所以不存在feign的服务调用负载等,
统一通过@FeignClient的url参数直接指定调用地址。
#### 待扩展
kubernetes 云原生扩展
### 参考文档
[open feign官方文档](https://docs.spring.io/spring-cloud-openfeign/docs/2.2.5.RELEASE/reference/html/)
......@@ -9,7 +9,6 @@ import org.springframework.cloud.openfeign.FeignFormatterRegistrar;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
import java.time.format.DateTimeFormatter;
......@@ -45,19 +44,14 @@ public class Config {
@Bean
public FeignFormatterRegistrar feignFormatterRegistrar() {
return new FeignFormatterRegistrar() {
@Override
public void registerFormatters(
FormatterRegistry formatterRegistry) {
DateTimeFormatterRegistrar registrar =
new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(false);
registrar.setDateFormatter(dateFormatter);
registrar.setTimeFormatter(timeFormatter);
registrar.setDateTimeFormatter(dateTimeFormatter);
registrar.registerFormatters(formatterRegistry);
}
return formatterRegistry -> {
DateTimeFormatterRegistrar registrar =
new DateTimeFormatterRegistrar();
registrar.setUseIsoFormat(false);
registrar.setDateFormatter(dateFormatter);
registrar.setTimeFormatter(timeFormatter);
registrar.setDateTimeFormatter(dateTimeFormatter);
registrar.registerFormatters(formatterRegistry);
};
}
}
package com.bailuntec.api.bailuntec.oa;
import com.bailuntec.api.bailuntec.oa.response.ExchangeRate;
import com.bailuntec.api.bailuntec.oa.response.OaDepartmentResp;
import com.bailuntec.api.bailuntec.oa.response.OaUserResp;
import org.springframework.cloud.openfeign.FeignClient;
......@@ -17,7 +16,7 @@ import java.util.List;
* @author robbendev
* @since 2020/10/12 2:09 下午
*/
@FeignClient(name = "oa", url = "oa.bailuntec.com")
@FeignClient(name = "oa", url = "http://oa.bailuntec.com")
public interface OaApi {
/**
......@@ -42,7 +41,22 @@ public interface OaApi {
List<OaDepartmentResp> getDeparmentList();
/**
* 获取汇率
*
* @param fromCur 源币种
* @param toCur 目标币种
* @return str 需要手动转换成{@link com.bailuntec.api.bailuntec.oa.response.ExchangeRate}
* <p>
* <p>
* 转换代码
* <code>
* String res = oaApi.getExchangeRate("CNY", "CNY");
* String response = BltResponseUtil.filterColonAndBackslash(res);
* ExchangeRate exchangeRate = JsonUtilByFsJson.jsonToBean(response, ExchangeRate.class);
* </code>
*/
@GetMapping("/api/ExchangeRate/GetExchangeRate")
String getExchangeRate(@RequestParam("fromCur") String fromCur,
@RequestParam("toCur") String toCur);
@RequestParam("toCur") String toCur);
}
package com.bailuntec.api.bailuntec.oa.response;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
......@@ -23,5 +23,8 @@ public class ExchangeRate {
@JsonProperty("ToCurName")
private String toCurName;
@JsonProperty("CreateTime")
private LocalDateTime createTime;
}
......@@ -41,12 +41,12 @@ public interface SsoApi {
@Override
public SsoResult<List<GetCompanysResp>> getCompanys() {
return null;
return new SsoResult<>();
}
@Override
public SsoResult<GetUserByCompanyResp> getUserByCompany() {
return null;
return new SsoResult<>();
}
}
}
package com.bailuntec.api.common;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/14 11:20 上午
*/
public class BltResponseUtil {
/**
* 去除首尾冒号和反斜杠
*
* @param res str
*/
public static String filterColonAndBackslash(String res) {
return res.replaceAll("\\\\", "")
.replaceAll("^\"*|\"*$", "");
}
}
package com.bailuntec.api.common;
import com.bailuntec.api.Config;
import feign.Feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.lang.NonNull;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2021/1/14 11:31 上午
*/
public class FeignUtil {
public static <T> T getInstance(@NonNull Class<T> FeignApiType) {
Config config = new Config();
return Feign
.builder()
.decoder(config.feignDecoder())
.contract(new SpringMvcContract())
.target(FeignApiType, FeignApiType.getAnnotation(FeignClient.class).url());
}
}
package com.bailuntec.api;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
......
......@@ -3,6 +3,7 @@ package com.bailuntec.api.bailuntec.oa;
import com.bailuntec.api.TestApplication;
import com.bailuntec.api.amazon.api.JsonUtilByFsJson;
import com.bailuntec.api.bailuntec.oa.response.ExchangeRate;
import com.bailuntec.api.common.BltResponseUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
......@@ -34,14 +35,15 @@ class OaApiTest {
}
@Test
void getDeparmentList() {
void getDepartmentList() {
}
@Test
void getExchangeRate() {
String exchangeRate = oaApi.getExchangeRate("CNY", "CNY");
log.info(exchangeRate);
ExchangeRate exchangeRate1 = JsonUtilByFsJson.jsonToBean(exchangeRate, ExchangeRate.class);
log.info(exchangeRate1.toString());
String res = oaApi.getExchangeRate("CNY", "CNY");
String response = BltResponseUtil.filterColonAndBackslash(res);
log.info(response);
ExchangeRate exchangeRate = JsonUtilByFsJson.jsonToBean(response, ExchangeRate.class);
log.info(exchangeRate.toString());
}
}
package com.bailuntec.api.bailuntec.oa;
import com.bailuntec.api.Config;
import com.bailuntec.api.amazon.api.JsonUtilByFsJson;
import com.bailuntec.api.bailuntec.oa.response.ExchangeRate;
import com.bailuntec.api.common.BltResponseUtil;
import feign.Feign;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2020/10/29 6:04 下午
*/
@Slf4j
class OaApiTestNoSpring {
@Test
void getAllUser() {
}
@Test
void getDeparmentList() {
}
@Test
void getExchangeRate() {
Config config = new Config();
OaApi oaApi = Feign
.builder()
.decoder(config.feignDecoder())
.contract(new SpringMvcContract())
.target(OaApi.class, OaApi.class.getAnnotation(FeignClient.class).url());
String exchangeRate = oaApi.getExchangeRate("CNY", "CNY");
log.info(exchangeRate);
ExchangeRate exchangeRate1 = JsonUtilByFsJson.jsonToBean(BltResponseUtil.filterColonAndBackslash(exchangeRate), ExchangeRate.class);
log.info(exchangeRate1.toString());
}
}
package com.bailuntec.api.bailuntec.pams;
import com.bailuntec.api.amazon.api.JsonUtilByFsJson;
import com.bailuntec.api.bailuntec.pams.response.GetAccountTokenResp;
import com.bailuntec.api.bailuntec.pams.response.PamsResult;
import com.bailuntec.api.common.FeignUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2020/10/28 5:37 下午
*/
@Slf4j
class PamsApiTestNoSpring {
@Test
void getAccountToken() {
PamsApi pamsApi = FeignUtil.getInstance(PamsApi.class);
PamsResult<List<GetAccountTokenResp>> result = pamsApi.getAccountToken();
log.info(JsonUtilByFsJson.beanToJson(result));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment