• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

远程服务调用:案例一、微服务模块之间的远程调用

第一步:引入依赖

属国

groupIdorg.springframework.cloud/groupId

artifactId spring-cloud-starter-open feign/artifactId

/依赖关系

第二步:在启动类上加入开启远程调用注解

@EnableFeignClients

第三步:调用接口

3.1 首先建立一个远程调用接口客户端(供业务层调用该接口)

//这个接口主要是调用用户的方法

//添加注解

@ FeignClient(value=' user ')//value的值就是用户配置中的应用程序名称的值,就是服务名

公共接口FeginUserClient {

//写要调用的用户控制器中的方法,这里最好复制控制器中方法,不要手写

//比如我要调用一个删除的接口

@删除映射('/user/deleteUser/{ userId } ')//注意这里的全球资源定位器(统一资源定位器)地址一定要写全,不可以少

public R deleteUser(@ path变量(' userId ')字符串userId);//只复制方法,不要复制方法体,注意参数一定要

//写清楚,不可以省略,尤其是路径变量要写成@PathVariable('userId '),不可以省略

@ get mapping(value='/user/getUserByRequest ')

用户getUserByRequest(@ request param(' token ')字符串令牌);//注意该接口返回的是用户类,需要在领域中再添加

@ get mapping('/user/hospital/getHospitalNameById ')

String getHospitalNameById(@ request param(' hospital _ id ')String hospital _ id);

@ get mapping('/用户/医院/getall医院')

r getall医院();

}

3.2 使用接口(在你要用到的业务层、或者控制器层去注入并调用)

@服务

公共类HzMessageServiceImpl扩展ServiceImplHzMessageMapper,HzMessage实现HzMessageService {

@Autowired //将客户端注入到这里,然后就可以调用方法了

私有UserFeginClient客户端;

@覆盖

public boolean blCaseHzMessageInsert(BLCaseInviterVo BLCaseInviterVo,HttpServletRequest请求){

用户用户=客户端。getuserbyrequest(请求。get头(' 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);
       
  }
}
 

 

Link to comment
Share on other sites