欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Feign远程调用

程序员文章站 2022-07-15 13:05:56
...

1.引入jar包

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

2.添加注解@EnableFeignClients

package cn.itcast;

        import org.springframework.boot.SpringApplication;
        import org.springframework.cloud.client.SpringCloudApplication;
        import org.springframework.cloud.client.loadbalancer.LoadBalanced;
        import org.springframework.cloud.openfeign.EnableFeignClients;
        import org.springframework.context.annotation.Bean;
        import org.springframework.web.client.RestTemplate;

//@EnableCircuitBreaker
//@EnableDiscoveryClient
//@SpringBootApplication
//三个合并成一个
@EnableFeignClients
@SpringCloudApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class);
        System.out.println("consumer-demo启动成功");
    }
    //注册这个对象把他给spring容器管理这样我们以后就可以在其他的方法中调用了控制反转(IOC)
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

3.编写接口

package cn.itcast.consumer.client;

import cn.itcast.consumer.pojp.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("user-service")
public interface UserClient {
    @GetMapping("user/{id}")
    User queryById(@PathVariable("id") Long id);
}

4.修改controller方法

package cn.itcast.consumer.web;

import cn.itcast.consumer.client.UserClient;
import cn.itcast.consumer.pojp.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("consumer")
@DefaultProperties(defaultFallback = "queryByIdFallback")
public class ConsumerController {

    //这是在启动类的时候给spring 容器管理了
   /* @Autowired
    private RestTemplate restTemplate;*/
   // @Autowired
   // private DiscoveryClient discoverClient;
   // private RibbonLoadBalancerClient client;

    @Autowired
    private UserClient userClient;

    @GetMapping("{id}")
   /* @HystrixCommand(commandProperties = {
            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000") //超市时长调成了3秒
    })*/
    public User queryById(@PathVariable("id")Long id){
        return userClient.queryById(id);
    }

    public String queryByIdFallback(Long id){
        return "不好意思,服务器太拥挤";
    }
    public String queryByIdFallback(){
        return "不好意思,服务器太拥挤";
    }

/*    @GetMapping("{id}")
    public User queryById(@PathVariable("id")Long id){
        //根据服务id获取实例,因为可能有几台这边用得是list
      //  List<ServiceInstance> instances = discoverClient.getInstances("user-service");
       // 从实例中取出ip和端口因为我们这只有一个所以取list(0)
     //   ServiceInstance instance = client.choose("user-service");
      //  ServiceInstance instance  = instances.get(0);
     //   String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;
        String url = "http://user-service/user/"+id;
        User user = restTemplate.getForObject(url,User.class);
        return user;
    }*/
}

可能要把user-service中的user-service的睡眠去掉

package cn.itcast.user.service;


import cn.itcast.user.mapper.UserMapper;
import cn.itcast.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryBtyId(Long id){
       /* try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        return userMapper.selectByPrimaryKey(id);
    }

    @Transactional //事务
    public void insertUser(User user){
        userMapper.insert(user);
    }
}

#配置熔断
1添加配置

server:
  port: 8088
spring:
  application:
    name: consumer-service #起名字
#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka, http://127.0.0.1:10087/eureka
    #5秒拉取服务列表
    registry-fetch-interval-seconds: 5
#切换方式为随机默认是轮询 没有必要用这个写着让你看看有这么个东西
#user-service:
 # ribbon:
 #   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

#配置feign超时
feign:
  hystrix:
    enabled: true
ribbon:
  ConnectionTimeOut: 500
  ReadTimeOut: 20000

#配置全局超时
server:
  port: 8088
spring:
  application:
    name: consumer-service #起名字
#注册到服务中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka, http://127.0.0.1:10087/eureka
    #5秒拉取服务列表
    registry-fetch-interval-seconds: 5
#切换方式为随机默认是轮询 没有必要用这个写着让你看看有这么个东西
#user-service:
 # ribbon:
 #   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

#配置feign超时
feign:
  hystrix:
    enabled: true
ribbon:
  ConnectionTimeOut: 500
  ReadTimeOut: 20000

#配置全局超时
hystrix:
  command:
   default:
    execution:
     isolation:
      thread:
       timeoutInMilliseconds: 3000


2.方法配置

package cn.itcast.consumer.client;

import cn.itcast.consumer.pojp.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "user-service",fallback = UserClientFallback.class )
public interface UserClient {
    @GetMapping("user/{id}")
    User queryById(@PathVariable("id") Long id);
}

3。实现方法

package cn.itcast.consumer.client;

import cn.itcast.consumer.pojp.User;
import org.springframework.stereotype.Component;

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User queryById(Long id) {
        User user = new User();
        user.setName("未查询用户");
        return user;
    }
}

相关标签: feign