Feign的远程调用,用于服务与服务之间的调用

本文介绍了如何使用Spring Cloud Feign进行服务间的远程调用。首先,引入了openfeign依赖;接着,定义了一个Feign接口,用于调用order-service的查询订单方法;然后,在配置类中启用Feign客户端;最后,展示了如何在user-service中引入Feign模块依赖,注入并调用接口完成远程调用。

操作三步走

1.引入openfeign依赖
2.定义Feign接口
3.配置类@EnableFeignClients(value="feign接口所在包")

实现

1.创建一个Feign服务模块,引入依赖(版本号在父工程锁定了)

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2.定义Feign接口(这里面写的是一个服务调另一个服务的controller方法,没有方法体;比如我的用户服务user-service,需要远程调用订单服务order-service中的根据id查询订单信息,所以我将这个方法放到Feign接口中,需要时直接创建)

//远程调用那个服务
@FeignClient("orderservice")
public interface ItemFeign {
    //根据id查询订单
    @GetMapping("/item/{id}")
    public Item getId(@PathVariable Long id);
}

3.配置类@EnableFeignClients(value="feign接口所在包")

@EnableFeignClients(value = "com.hmall.common.feign")

value="feign接口的包",@EnableFeignClients让spring生成该代理对象

@SpringBootApplication
@EnableFeignClients(value = "com.hmall.common.feign")
public class SearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(SearchApplication.class,args);
    }
}

4.使用一下

1.在user-service引入Feign模块的maven依赖

<dependency>
    <groupId>com.hmall</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
<dependency>

2.注入这个接口
@Autowired
private ItemFeign itemFeign;

3.调用接口中的方法,实现了服务之间的远程调用

Item item = itemFeign.getId(id);

Feign中配置远程调用服务器IP有以下几种常见方法: ### 直接指定URL 在`@FeignClient`注解中使用`url`属性直接指定服务器的IP和端口。示例代码如下: ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "example-service", url = "http://192.168.1.100:8080") public interface ExampleFeignClient { @GetMapping("/api/resource") String getResource(); } ``` 这种方式适合在不使用服务发现机制,直接明确知道服务器IP和端口的场景。 ### 结合服务发现(如Eureka) 如果使用了服务发现机制,如Eureka,Feign可以结合它来动态获取服务器IP。首先确保服务提供者在Eureka注册中心注册,然后在`@FeignClient`注解中只指定服务名,不指定URL。示例如下: ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "provider-service") public interface UserFeignClient { @GetMapping("/users/{id}") User getUser(@PathVariable("id") Long id); } ``` Feign会通过服务发现机制从注册中心获取`provider-service`对应的服务器IP和端口。 ### 自定义负载均衡规则指定IP 在使用Ribbon进行负载均衡时,可以自定义负载均衡规则来指定特定的服务器IP。例如创建一个自定义的`IRule`实现类: ```java import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ServerList; import com.netflix.loadbalancer.BaseLoadBalancer; import java.util.ArrayList; import java.util.List; public class CustomRule extends com.netflix.loadbalancer.AbstractLoadBalancerRule { @Override public Server choose(Object key) { BaseLoadBalancer loadBalancer = (BaseLoadBalancer) getLoadBalancer(); ServerList<Server> serverList = loadBalancer.getServerListImpl(); List<Server> targetServers = new ArrayList<>(); for (Server server : serverList.getAllServers()) { if ("192.168.1.100".equals(server.getHost())) { targetServers.add(server); } } if (!targetServers.isEmpty()) { return targetServers.get(0); } return null; } @Override public void initWithNiwsConfig(com.netflix.client.config.IClientConfig clientConfig) { } } ``` 然后在配置类中配置使用该规则: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.loadbalancer.IRule; @Configuration public class RibbonConfig { @Bean public IRule customRule() { return new CustomRule(); } } ``` 最后在`application.yml`中指定服务使用该配置: ```yaml provider-service: ribbon: NFLoadBalancerRuleClassName: com.example.CustomRule ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值