标签:调用 服务 String userId 接口 user 远程
远程服务调用:案例一、微服务模块之间的远程调用
第一步:引入依赖
dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
第二步:在启动类上加入开启远程调用注解
@EnableFeignClients
第三步:调用接口
-
3.1 首先建立一个远程调用接口客户端(供业务层调用该接口)
//这个接口主要是调用user的方法
//添加注解
@FeignClient(value = "user") //value的值就是user配置中的spring.application.name的值,就是服务名
public interface FeginUserClient {
//写要调用的user控制器中的方法,这里最好复制控制器中方法,不要手写
//比如我要调用一个删除的接口
@DeleteMapping("/user/deleteUser/{userId}") //注意这里的url地址一定要写全,不可以少
public R deleteUser(@PathVariable("userId") String userId); //只复制方法,不要复制方法体,注意参数一定要
//写清楚,不可以省略,尤其是PathVariable要写成@PathVariable("userId"),不可以省略
@GetMapping(value = "/user/getUserByRequest")
User getUserByRequest(@RequestParam("token") String token); //注意该接口返回的是User类,需要在domain中再添加
@GetMapping("/user/hospital/getHospitalNameById")
String getHospitalNameById(@RequestParam("hospital_id") String hospital_id);
@GetMapping("/user/hospital/getAllHospital")
R getAllHospital();
}
-
3.2 使用接口(在你要用到的业务层、或者controller层去注入并调用)
@Service
public class HzMessageServiceImpl extends ServiceImpl<HzMessageMapper, HzMessage> implements HzMessageService {
@Autowired //将客户端注入到这里,然后就可以调用方法了
private UserFeginClient client;
@Override
public boolean blCaseHzMessageInsert(BLCaseInviterVo blCaseInviterVo, HttpServletRequest request) {
User user = client.getUserByRequest(request.getHeader("token"));
}
}
@CrossOrigin
public class ApplyConsultController{
@Autowired //将客户端注入到这里,然后就可以调用方法了
private FeginUserClient userClient;
@DeleteMapping("/fegin/{userId}")
public R fegin(@PathVariable String userId){
R r = userClient.deleteUser(userId); //调用远程连接客户端接口
return r;
}
}
小结
-
使用远程调用的时候,一定要记住,服务名已经注册到nacos里面了,如果没有调用成功,一定要检查,url地址,方法参数,服务名。哪个服务要实现调用就要哪个服务中加入依赖和开启远程调用,接口都在这个服务中使用
案例二:核酸检测
-
用到百度地图:根据地址获取经纬度
https://lbs.qq.com/service/webService/webServiceGuide/webServiceGeocoder
-
根据地址获取的数据是json格式
//GET请求示例,注意参数值要进行URL编码
https://apis.map.qq.com/ws/geocoder/v1/?address=北京市海淀区彩和坊路海淀西大街74号&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
{
"status": 0,
"message": "query ok",
"result": {
"title": "海淀西大街74号",
"location": {
"lng": 116.307015,
"lat": 39.982915
},
"ad_info": {
"adcode": "110108"
},
"address_components": {
"province": "北京市",
"city": "北京市",
"district": "海淀区",
"street": "海淀西大街",
"street_number": "74"
},
"similarity": 0.8,
"deviation": 1000,
"reliability": 7,
"level": 9
}
}
远程调用模块
@Configuration
@Component
public class RestTamplates {
@Autowired
private RestTemplateBuilder builder;
@Bean
public RestTemplate restTemplate(){
return builder.build();//解决get方式发送json参数问题
}
}
//我们自己封装的HttpClient,通常都会有一些模板代码,比如建立连接,构造请求头和请求体,然后根据响应,解析响应信息,最后关闭连接。
//RestTemplate是Spring中对HttpClient的再次封装,简化了发起HTTP请求以及处理响应的过程,抽象层级更高,减少消费者的模板代码,使冗余代码更少。
//Spring Cloud有一个声明式服务调用Feign,是基于Netflix Feign实现的,整合了Spring Cloud Ribbon与 Spring Cloud Hystrix,并且实现了声明式的Web服务客户端定义方式。本质上Feign是在RestTemplate的基础上对其再次封装,由它来帮助我们定义和实现依赖服务接口的定义。
@Service
public class NucleicServiceImpl extends ServiceImpl<NucleicMapper, Nucleic> implements NucleicService {
@Autowired
private RestTamplates restTamplate;
@Override
public Boolean coordinateAllUpdate() {
//getForObject:返回响应体中数据转化成的对象,可以理解为json
//getForEntity:返回的是ResponseEntity的对象包含了一些重要的信息 例如以下代码
//远程调用获取参数
StringBuilder sb = new StringBuilder();
sb.append("?key=");
sb.append("&output=jsonp");
ResponseEntity<String> forEntity1 = restTamplate.restTemplate().getForEntity(addressDetil, String.class);
JSONObject result = JSONObject.parseObject(forEntity1.getBody()).getJSONObject("result");
if (result == null)
continue;
ResultVo resultVo = result.getObject("location", ResultVo.class);
if (resultVo == null)
continue;
nucleic.setLat(resultVo.getLat());
nucleic.setLng(resultVo.getLng());
int update = baseMapper.updateById(nucleic);
}
}
标签:调用,服务,String,userId,接口,user,远程 来源: https://www.cnblogs.com/Sofiacodes/p/16217240.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。