springcloud微服务(六)—— 基于feign远程调用
我们前面的远程调是直接输入的url这样写不利于维护,也不够优雅。本节使用feign远程调用可以优雅地实现。
1.引入依赖
<!-- feign客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--springboot项目使用feign需加此依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
注意nacos中的ribbon会使loadbalanc我们将失败nacos依赖中的ribbon剔除。(feign负载均衡功能)
<!-- nacos客户端依赖包 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!-- nacos中的ribbon会使loadbalanc包失效--> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
<version>2.2.5.RELEASE</version>
</dependency>
2.在需要进行远程调用服务的启动类中开启feign,添加@EnableFeignClients注解。
@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
3.编写feign客户端。
package com.bzw.clients;
import com.bzw.domain.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("userservice") //服务名称
public interface UserClient {
@GetMapping("/user/{userId}") //请求方式路径
User findById(@PathVariable("userId") Long id); //请求参数,返回类型
}
4.调用
package com.bzw.service.impl;
import com.bzw.clients.UserClient;
import com.bzw.domain.TbOrder;
import com.bzw.domain.User;
import com.bzw.mapper.TbOrderMapper;
import com.bzw.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private TbOrderMapper tbOrderMapper;
@Autowired
private UserClient userClient;
public TbOrder findOrderById(Long id) {
// 查询订单
TbOrder tbOrder = tbOrderMapper.selectByPrimaryKey(id);
// 用feign远程调用
User user = userClient.findById(tbOrder.getUserId());
// 封装User到Order
tbOrder.setUser(user);
// 返回
return tbOrder;
}
}
5.测试
访问 localhost:8080/order/101