0
点赞
收藏
分享

微信扫一扫

微服务之间的调用方式RestTemplate和FeignClient

洲行 2023-06-02 阅读 49


SpringCloud服务间的调用有两种方式:RestTemplate和FeignClient。不管是什么方式,他都是通过REST接口调用服务的http接口,参数和结果默认都是通过jackson序列化和反序列化。因为Spring MVC的RestController定义的接口,返回的数据都是通过Jackson序列化成JSON数据。

一、RestTemplate

使用这种方式,只需要定义一个RestTemplate的Bean,设置成LoadBalanced即可。

如下示例:

@Configuration
public class SomeCloudConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
    return new RestTemplate();
}
}

这样我们就可以在需要用的地方注入这个bean使用:

public class SomeServiceClass {
@Autowired
private RestTemplate restTemplate;
public String getUserById(Long userId) {
    UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class);
    return results;
}
}

其它示例参考:

@SpringBootApplication
public class SleuthClientApplication {
  
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
  
    public static void main(String[] args) {
        SpringApplication.run(SleuthClientApplication.class, args);
    }
}
  
@RestController
class HomeController {
  
    private static final Log log = LogFactory.getLog(HomeController.class);
    @Autowired
    private RestTemplate restTemplate;
      
    private String url="http://localhost:9986";
  
    @RequestMapping("/service1")
    public String service1() throws Exception {
        log.info("service1");
        Thread.sleep(200L);
        String s = this.restTemplate.getForObject(url + "/service2", String.class);
        return s;
    } 
}

二、FeignClient

 除了上面的方式,我们还可以用FeignClient。

@FeignClient(value = "users", path = "/users")
public interface UserCompositeService {
@RequestMapping(value = "/getUserDetail/{id}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
UserDTO getUserById(@PathVariable Long id);
}

  我们只需要使用@FeignClient定义一个接口,Spring Cloud Feign会帮我们生成一个它的实现,从相应的users服务获取数据。

  其中,@FeignClient(value = “users”, path = “/users/getUserDetail”)里面的value是服务ID,path是这一组接口的path前缀。在下面的方法定义里,就好像设置Spring MVC的接口一样,对于这个方法,它对应的URL是/users/getUserDetail/{id}。然后,在使用它的时候,就像注入一个一般的服务一样注入后使用即可:

<insert id="insertBatch" parameterType="List">
INSERT INTO TStudent(name,age)
<foreach collection="list" item="item" index="index" open="("close=")"separator="union all">
SELECT #{item.name} as a, #{item.age} as b FROM DUAL
</foreach>
</insert>

举报

相关推荐

0 条评论