跨服务的两种方法

问题

  1. 跨服务调用 feign方法
  2. 调用第三方接口 resttemplate方法

解决方法

  • feign
  1. 首先是feign的跨服务调用,这是controller层的代码
    @Permission(permissionLogin = true)
    @ApiOperation("feign调用示例接口")
    @PostMapping(value = "/feign")
    public ResponseEntity<ReturnMessage> feign(@RequestBody List<feignVO> feignVOS) {
        ResponseEntity<FeignRunInfo> feignResult = feignToService.insert(feignVOS);
        ReturnMessage<FeignRunInfo> returnMessage = new ReturnMessage();
        if (feignResult != null && feignResult.hasBody()) {
            FeignRunInfo feignRunInfo = feignResult.getBody();
            returnMessage.feignStatus(feignRunInfo.noErrorMsg(), feignRunInfo);
        }
        return new ResponseEntity<>(returnMessage, HttpStatus.OK);
    }

其实是有封装了返回的数据,所以会比较繁琐,本来没有那么多代码的。

  1. 进到服务层,要注意服务层的代码需要加注解@FeignClient
/**
 * 〈跨服务调用〉
 */
@FeignClient(value = "feignTo-service", fallbackFactory = FeignFeignToFallBackFactory.class)
public interface IFeignFeignToService {
    /**
     * [接口] 数据接口
     *
     * @param feignVOS 新增的数据
     * @return 返回状态数据
     */
    @PostMapping(value = "/insert")  //调用的接口地址
    ResponseEntity<FeignRunInfo> insert(@RequestBody List<FeignVO> feignVOS);
}

实现类

@Component
public class FeignFeignToFallBackFactory implements FallbackFactory<IFeignFeignToService> {

    private static final String ERROR_MSG = "An error occurs at run time.";

    @Override
    public IFeignFeignToService create(Throwable cause) {
        return new IFeignFeignToService() {
            @Override
            public ResponseEntity<FeignRunInfo> insert(List<FeignVO> feignVOS) {
                FeignRunInfo feignRunInfo = new FeignRunInfo();
                feignRunInfo.setErrorMsg(ERROR_MSG);
                return new ResponseEntity<>(feignRunInfo, HttpStatus.OK);
            }
        };
    }
}

这样就实现了feign跨服务调用。
有几个需要注意的点:

  1. 调用的接口和待调用的接口数据需一致
  2. 在本地调试时需要两个服务都起起来

  • resttemplate
  1. 笔者这边调用墨迹天气的接口,控制层代码,通过经纬度查询某地天气,这里的url做了一个变量处理,如果要改第三方接口地址,也是可以改的。
/**
 * 〈天气〉
 *
 * @author GuoYongQin
 * @create 2018/10/24
 * @since 1.0.0
 */
@RestController
@RequestMapping(value = "/v1/api/weather")
public class WeatherController {

    @Autowired
    private IWeatherService weatherService;

    @Permission(permissionLogin = true)
    @ApiOperation(value = "weather接口")
    @RequestMapping(value = "/weather", method = RequestMethod.GET)
    public ResponseEntity<MoJiWeatherBO> weather(@RequestParam String url,
                                                 @RequestParam Double longitude,
                                                 @RequestParam Double latitude) {
        return new ResponseEntity<>(weatherService.moJiWeather(code, longitude, latitude), HttpStatus.OK);
    }
}

  1. 进到服务接口

public interface IWeatherService {

    MoJiWeatherBO moJiWeather(String url, Double longitude, Double latitude);

}

  1. 实现类
@Service
public class WeatherServiceImpl implements IWeatherService {

    @Autowired
    private RestTemplate restTemplate;

        String url = "http://aliv8.data.moji.com/whapi/json/aliweather/forecast15days";
        String token = "7538f7246218bdbf795b329ab09cc524";

    @Override
    public MoJiWeatherBO moJiWeather(String url, Double longitude, Double latitude) {
        String weatherInfo = null;
                weatherInfo = requestWeatherInfo(url, longitude, latitude);
        if (weatherInfo != null) {
            return JSONObject.parseObject(weatherInfo, MoJiWeatherBO.class);
        } else {
            return new MoJiWeatherBO();
        }
    }

    private String requestWeatherInfo(String url, Double longitude, Double latitude) {
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.add("Content-Type", "application/x-www-form-urlencoded");
            headers.add("Authorization", "APPCODE c4cb20e0631c4fa49335860c2195c47e");
            MultiValueMap<String, Object> postParameters = new LinkedMultiValueMap<>();
            postParameters.add("lon", safeToString(longitude));
            postParameters.add("lat", safeToString(latitude));
            postParameters.add("token", token);
            HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParameters, headers);
            ResponseEntity<String> result = restTemplate.postForEntity(url, requestEntity, String.class);
            return result.getBody();
        } catch (RestClientException e) {
            return null;
        }
    }

    private String safeToString(Object object) {
        return (object == null ? "" : object.toString());
    }

}

这样就实现了rest template第三方接口跨服务调用。

总结

rest template我在网上看到的资料不多,毕竟可以直接用http请求方法,不过这种方法也可以试试。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ps:主要解决在webservice中,我们想从另外一个项目调用webservice项目的接口,也就是项目调用接口 这里主要用到了xfire wsdl 废话不说了 直接上东西 1. 首先新建一个项目 2. 在src下创建两个文件: a) 第一个是你想要访问的webservice的接口,比如我想访问的接口是 ReleaseService 那就在当前项目创建一个ReleaseService接口(接口中的方法必须和你想要访问的webservice的接口中的方法相同) b) 第二个是你的调用类 3. 导入相应的jar包,这些包不能引用,一定要复制到lib文件夹下面在引用 4. 具体的实现代码 TestWebService方法的代码: package com.isanta.webServiceTest; import java.io.InputStream; import java.net.MalformedURLException; import java.util.Properties; import java.util.Scanner; import org.codehaus.xfire.XFireFactory; import org.codehaus.xfire.client.XFireProxyFactory; import org.codehaus.xfire.service.Service; import org.codehaus.xfire.service.binding.ObjectServiceFactory; public class TestWebService { /** * @param args */ public static void testWebService() throws MalformedURLException, Exception{ // TODO Auto-generated method stub /** *这里是我的参数放在了properties文件中,我在读取里面的参数,这里我们也可以通过方法传参数 *如 : testWebService(String url,String xMlStr)() 那么在调用的时候就可以直接传进来了 *url 是你访问的webservice 的tomcat 的服务器地址 */ Properties pro = new Properties(); InputStream in = null; in = TestWebService.class.getResourceAsStream("/request.properties"); pro.load(in); String url = pro.getProperty("url"); String xMLstr = pro.getProperty("xMLstr"); Service s=new ObjectServiceFactory().create(ReleaseService.class); XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire()); System.out.println("url="+url); try { //这里就是获取webservice的接口的实例对象 ReleaseService seleaseService=(ReleaseService) xf.create(s,url); System.out.println("进入接口----------------->请求报文:"+xMLstr); //这里就是调用你需要的接口的方法 String st=seleaseService.queryReceiptDatas(xMLstr); System.out.print(st); } catch(Exception e) { e.printStackTrace(); } } } 5. 将整个项目打包成jar 6. 将打好的jar包引入到你想要调用的项目中,然后就想 正常的代码一样来调用,如: import java.net.MalformedURLException; import com.isanta.webServiceTest.TestWebService; public class Test { public static void main(String[] args) throws MalformedURLException, Exception { TestWebService.testWebService(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值