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;
}
}
推荐阅读
-
杀死进程,解决运行异常---让64位程序调用32位程序更流畅
-
[WPF自定义控件库]使用TextBlockHighlightSource强化高亮的功能,以及使用TypeConverter简化调用
-
python远程邮件控制电脑升级版
-
python使用ctypes模块调用windowsapi获取系统版本示例
-
在Python 不同级目录之间模块的调用方法
-
python调用windows api锁定计算机示例
-
在Python中调用Ping命令,批量IP的方法
-
Python中实现远程调用(RPC、RMI)简单例子
-
在jquery中的ajax方法怎样通过JSONP进行远程调用
-
zabbix调用api检索方法