【方法1】Springcloud之间的调用
1、符合该架构规范的@FeignClient访问方式,feign在Springcloud中的使用。
(1)添加feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
(2)创建feignClient
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//@FeignClient(value = "offerprpall")
@FeignClient(name = "offerprpall",url = "http://10.75.5.10:19225/")
@Service
public interface LoginIntializtionFeign {
/**
* @description: 初始界面开关加载
* @param:InitializationQueryVo 入参
* @return InitializationResponseVo 返参
*/
@RequestMapping(value = "/comCode/comCodeApi",method = {RequestMethod.POST})
public InitializationResponseVo loginIntializtion(@RequestBody InitializationQueryVo queryVo) throws Exception;//复合类型好像默认是POST请求
@RequestMapping( value = "/findAll/{name}",method = RequestMethod.GET)
public List<SpringUser> findAll(@PathVariable("name") String name);//get方式
@FeignClient(value = "offerprpall")这种方式是常见的写法, 用于通知Feign组件对该接口进行代理(不需要编写接口实现),name属性指定我们要调用哪个服务,不带URl的是在注册中心已经配置好。使用者可直接通过@Autowired注入。如下
@Autowired
private LoginIntializtionFeign loginIntializtionFeign;
-
@RequestMapping表示在调用该方法时需要向/findAll/{name}发送GET请求。
原理:Spring Cloud应用在启动时,Feign会扫描标有@FeignClient注解的接口,生成代理,并注册到Spring容器中。生成代理时Feign会为每个接口方法创建一个RequetTemplate对象,该对象封装了HTTP请求需要的全部信息,请求参数名、请求方法等信息都是在这个过程中确定的,Feign的模板化就体现在这里。
(3)启动类上添加注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.ace.cache.EnableAceCache;
@EnableEurekaClient
@SpringBootApplication
@ComponentScan(basePackages={"com.guorenpcic.grecar","com.gr.framework.security.common"})
// 开启druid监控
@ServletComponentScan("com.guorenpcic.grecar.config.druid")
// 开启事务
@EnableTransactionManagement
// 开启熔断监控
@EnableCircuitBreaker
//// 开启服务鉴权
@EnableFeignClients({"com.gr.framework.security.auth.client.feign","com.guorenpcic.grecar.feign"})
@EnableAceCache
public class GrECarApplication {
public static void main(String[] args) {
SpringApplication.run(GrECarApplication.class, args);
}
}
(4)配置文件
logging:
level:
com:guorenpcic.grecar: INFO
com.guorenpcic.grecar.mapper: DEBUG
test: INFO
spring:
application:
name: gr-ecar-app
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_empty
datasource:
name: test
#测试环境
url: jdbc:mysql://10.75.5.10:3306/gr_ecar?useUnicode=true&characterEncoding=UTF8
username: root
password: password
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
rabbitmq:
host: 10.75.5.10
port: 5672
username: user
password: password
# 配置数据库
mybatis:
basepackage: com.guorenpcic.grecar.mapper
xmlLocation: classpath:mapper/**/*.xml
server:
port: 21113
# 配置spring cloud 服务发现
eureka:
instance:
statusPageUrlPath: /info
healthCheckUrlPath: /health
# docker 部署开启
prefer-ip-address: true
ip-address: 10.75.5.10
client:
serviceUrl:
# defaultZone: http://10.75.5.10:18901/eureka/
defaultZone: http://10.75.5.10:8761/eureka/
#开发环境
# defaultZone: http://10.75.42.11:${EUREKA_PORT:8001}/eureka/
# 配置swagger
swagger:
basepackage: com.guorenpcic.grecar.security.common.rest
service:
name: 车险出单平台后端应用
description: 车险出单平台后端应用服务接口文档
developer: dc
#redis-cache 相关
redis:
pool:
maxActive: 300
maxIdle: 100
maxWait: 1000
host: 10.75.5.10
port: 6380
password:
timeout: 2000
# 服务或应用名
sysName: gr-ecar
enable: true
database: 0
# 配置用户认证和服务认证信息
auth:
serviceId: gr-auth
user:
token-header: Authorization
client:
id: gr-ecar-app
secret: 9zRzsRos
token-header: client-token
hystrix:
command:
default:
execution:
timeout:
enabled: false
ribbon:
ReadTimeout: 120000
ribbon:
ConnectTimeout: 30000
【方法2】
2、微服务之间的调用,不用feignClient,直接用http想调用其他项目的接口(不是微服务之间也能调用,如Springcloud调servlet方法)
public static String validateIdentity(String url, String jsonString) throws Exception {
SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());
CloseableHttpClient httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build();
// DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonString,"gbk");// 解决中文乱码问题
entity.setContentEncoding("gbk");
entity.setContentType("application/json");
httpPost.setEntity(entity);
System.out.println(jsonString);
HttpResponse httpResponse = httpClient.execute(httpPost);
String resultJson = EntityUtils.toString(httpResponse.getEntity());
resultJson = URLDecoder.decode(resultJson, "UTF-8");
System.out.println(resultJson);
return resultJson;
}
String responseJson = HttpUtil.validateIdentity(BASE_URL+"comCode/comCodeApi",JSON.toJSONString(initializationQueryVo));
initializationResponseVo = JSON.parseObject(responseJson, InitializationResponseVo.class);
扩展调用:
private List<PrpDunitMaintenanceSHDto> queryPrpDunitMaintenanceSH(SelectTagListDto selectTagListDto) throws Exception {
String url = GR_DMS_URL+"/prpDunitMaintenanceSH/queryPrpDunitMaintenanceSH";//另一个系统的url
LOGGER.info("‘’‘’‘’‘’‘’‘’‘’‘’‘’决策单元地址:"+ url);//测试所用
String res = HttpClientUtil.validateIdentity(url, JSONObject.toJSONString(selectTagListDto),"UTF-8");//http方式调用,在调接口成功后一直不识别中文,注意要加上入参的编码格式
LOGGER.info("‘’‘’‘’‘’‘’‘’‘’‘’‘’决策单元结果:"+res );//测试所用
List<PrpDunitMaintenanceSHDto> prpdunitMaintenanceSHDtoList = JSONObject.parseArray(res,PrpDunitMaintenanceSHDto.class);
return prpdunitMaintenanceSHDtoList;
}
public static String validateIdentity(String url, String jsonString,String bianma) throws Exception {
SystemDefaultRoutePlanner routePlanner = new SystemDefaultRoutePlanner(ProxySelector.getDefault());
CloseableHttpClient httpClient = HttpClients.custom().setRoutePlanner(routePlanner).build();
//设置超时时间 by chenxiaohui 20180721 beign
//RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).build();//设置请求和传输超时时间
//设置超时时间 by chenxiaohui 20180721 end
// DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonString,bianma);// 解决中文乱码问题
entity.setContentEncoding("gbk");
entity.setContentType("application/json");
httpPost.setEntity(entity);
/** 设置超时时间 by chenxiaohui 20180721 beign */
//httpPost.setConfig(requestConfig);
/** 设置超时时间 by chenxiaohui 20180721 end */
System.out.println(jsonString);
HttpResponse httpResponse = httpClient.execute(httpPost);
String resultJson = EntityUtils.toString(httpResponse.getEntity());
resultJson = URLDecoder.decode(resultJson, "UTF-8");//反参的编码格式
System.out.println("======================"+resultJson);//获得核心的计算保费反参
return resultJson;
}