美文网首页
微服务之间相互调用方法

微服务之间相互调用方法

作者: _花 | 来源:发表于2022-04-12 16:59 被阅读0次

    微服务之间相互调用常用到的是
    HttpUrlConnection 或者经典的网络访问框架 HttpClient
    只是在 Spring 项目中,使用 RestTemplate 显然更方便一些
    RestTemplate

    简介:

    RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。
    用法

    GET请求

    1.getForEntity
    @RestController
    public class UseHelloController {
        @Autowired
        RestTemplate restTemplate;
    @GetMapping("/hello")
        public String hello(String name) {
            .....
            ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, name);
            StringBuffer sb = new StringBuffer();
            HttpStatus statusCode = responseEntity.getStatusCode();
            String body = responseEntity.getBody();
            ....
        }
    }
    

    第一个参数是 url ,url 中有一个占位符 {1} ,如果有多个占位符分别用 {2} 、 {3} … 去表示,第二个参数是接口返回的数据类型,最后是一个可变长度的参数,用来给占位符填值。
    另两种参数格式

    • 占位符不使用数字,而是使用参数的 key,同时将参数放入到一个 map 中。map 中的 key 和占位符的 key 相对应,map 中的 value 就是参数的具体值,例如还是上面的请求,利用 map 来传递参数,请求方式如下:
    Map<String, Object> map = new HashMap<>();
    String url = "http://" + host + ":" + port + "/hello?name={name}";
    map.put("name", name);
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, map);
    
    • 第二个是使用 Uri 对象,使用 Uri 对象时,参数可以直接拼接在地址中,例如下面这样:
    String url = "http://" + host + ":" + port + "/hello?name="+ URLEncoder.encode(name,"UTF-8");
    URI uri = URI.create(url);
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
    
    2.getForObject

    方法使用与上述类似,唯一不同之处是: getForObject 的返回值就是服务提供者返回的数据,使用 getForObject 无法获取到响应头。

    POST 请求

    1.postForEntity
    String url = "http://" + host + ":" + port + "/hello2";
        MultiValueMap map = new LinkedMultiValueMap();
        map.add("name", name);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
        return responseEntity.getBody();
    

    postForEntity 方法第一个参数是请求地址,第二个参数 map 对象中存放着请求参数 key/value,第三个参数则是返回的数据类型

        User u1 = new User();
        u1.setUsername("牧码小子");
        u1.setAddress("深圳");
        ResponseEntity<User> responseEntity = restTemplate.postForEntity(url, u1, User.class);
        return responseEntity.getBody();
    
    2.postForObject

    postForObject 和 postForEntity 基本一致,就是返回类型不同而已,这里不再赘述。

    3.postForLocation
    String s = restTemplate.getForObject(uri, String.class);
    

    PUT请求

    提供方

    @PutMapping("/user/name")
    @ResponseBody
    public void updateUserByUsername(User User) {
        System.out.println(User);
    }
    @PutMapping("/user/address")
    @ResponseBody
    public void updateUserByAddress(@RequestBody User User) {
        System.out.println(User);
    }
    

    调用方

        MultiValueMap map = new LinkedMultiValueMap();
        map.add("username", "牧码小子");
        map.add("address", "深圳");
        restTemplate.put(url1, map);
        User u1 = new User();
        u1.setAddress("广州");
        u1.setUsername("江南一点雨");
        restTemplate.put(url2, u1);
    

    DELETE 请求

    提供方

    @DeleteMapping("/user/{id}")
    @ResponseBody
    public void deleteUserById(@PathVariable Integer id) {
        System.out.println(id);
    }
    @DeleteMapping("/user/")
    @ResponseBody
    public void deleteUserByUsername(String username) {
        System.out.println(username);
    }
    

    调用方

    @GetMapping("/hello10")
    public void hello10() {
        List<ServiceInstance> list = discoveryClient.getInstances("provider");
        ServiceInstance instance = list.get(0);
        String host = instance.getHost();
        int port = instance.getPort();
        String url1 = "http://" + host + ":" + port + "/user/{1}";
        String url2 = "http://" + host + ":" + port + "/user/?username={username}";
        Map<String,String> map = new HashMap<>();
        map.put("username", "牧码小子");
        restTemplate.delete(url1, 99);
        restTemplate.delete(url2, map);
    }
    

    相关文章

      网友评论

          本文标题:微服务之间相互调用方法

          本文链接:https://www.haomeiwen.com/subject/qbxwsrtx.html