概述
1. RestTemplate
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
配置
@Configuration
public class RibbonConfig {
/**
* 在此类中为IoC 容器中注入一个RestTemplate 的Bean , 并在这个Bean 上加上@LoadBalanced 注解,此时RestTemplate 就结合了
* Ribbon 开启了负载均衡功能。
* @return
*/
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
最简单的调用测试
- 此测试,无需上面的 引用和配置
@RestController
public class RestTestController {
@GetMapping("/testRest")
public String testRest(){
RestTemplate restTemplate=new RestTemplate();
return restTemplate.getForObject("https://www.baidu.com/",String.class);
}
}
编写service调用 其他项目
@Service
public class RibbonService {
@Autowired
RestTemplate restTemplate;
/**
* 在该类的hi()方法用restTemplate调用eureka-client的API接口 Uri 上不需要使用硬编码(比如IP),只需要写服务名eureka-client即可
* 程序会根据服务名称 eureka-client到Eureka-server注册中心去自动获取IP和端口信息。
* @param name
* @return
*/
public String hi(String name) {
return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class);
}
}
//最终调用的是 这个接口:
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam String name) {
return "hi "+name+",i am from port:" +port;
}
编写action 调用 service
@RestController
public class RibbonController {
/**
* 写一个"/hi" Get 方法的接口,调用RibbonService 类的hi()方法
*/
@Autowired
RibbonService ribbonService;
@GetMapping("/hi")
public String hi(@RequestParam(required = false,defaultValue = "forezp") String name){
return ribbonService.hi(name);
}
//loadBalancer 注入
@Autowired
private LoadBalancerClient loadBalancer;
/**
* 通过LoadBalancerClient 去选择一个eureka-client 的服务实例的信息, 并将该信息返回
*
*/
@GetMapping("/testRibbon")
public String testRibbon() {
ServiceInstance instance = loadBalancer.choose("eureka-client");
// URI uri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
//结果为:localhost:8762
return instance.getHost()+":"+instance.getPort();
}
}
- idea开启并行执行
- 把eureka-client 在启动一个 8763的。会执行负载均衡
2. 声明式调用 Feign
pom 和 开启feign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<version>2.0.0.RELEASE</version> #失败的话,引用一个版本
@EnableFeignClients
使用feign调用 远程项目
主方法
/**
* 在接口上加@FeignClient 注解来声明一个Feign Client,其中value 为远程调用其他服务的服务名, FeignConfig.class 为Feign Client 的配置类
*
*/
@FeignClient(value = "eureka-client") //,fallback = EurekaClientHystrix.class
public interface EurekaClientFeign {
/**
* 在EurekaClientFeign 接口内部有一个sayHiFromClientEureka()方法,该方法通过Feign 来调用eureka-client 服务的“/hi”的API 接口
* @param name
* @return
*/
@GetMapping(value = "/hi")
String sayHiFromClientEureka(@RequestParam(value = "name") String name);
}
回退的方法
feign:
hystrix:
enabled: true #必须配置
@Component
public class EurekaClientHystrix implements EurekaClientFeign{
@Override
public String sayHiFromClientEureka(String name) {
return "进入Hystrix了";
}
}
远程调用失败,会重试的配置
@FeignClient(value = "eureka-client", configuration = FeignConfig.class)
@Configuration // 必须标明为配置类
public class FeignConfig {
/**
* 在该类中注入Retryer的Bean ,覆盖掉默认的Retryer的Bean,从而达到自定义配置的目的。
* 例如Feign 默认的配置在请求失败后, 重试次数为0 ,即不重试( Retry er.NEVER_RETRY )。
* 更改为 FeignClient请求失败后重试测试: 重试间隔为100毫秒,最大重试时间为1秒,重试次数5次。
* @return
*/
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 5);
} //不管怎么设置,都是重试 2次
}
controller 编写
@RestController
public class HiController {
@Autowired
HiService hiService;
@GetMapping("/hi")
public String sayHi(@RequestParam( defaultValue = "forezp",required = false)String name){
return hiService.sayHi(name);
}
}
在feign使用 httpclient 或 okhttp
feign默认是HttpURLConnection进行http请求发送
yaml配置
# 如何不想feign 使用默认的HttpURLConnection 使用httpclient 需要设置下面的属性
feign:
hystrix:
enabled: true
httpclient:
enabled: true
okhttp:
enabled: false
logging: ## Spring Cloud Gateway的日志配置
level:
com.forezp.client.EurekaClientFeign: DEBUG
config: classpath:logback.xml
xml配置
<!-- porn 文件加上apache-httpclient 的依赖, Feign 就会采用HttpClient 作为网络请求 框架,而不是默认的HttpURLConnection
-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>9.4.0</version>
</dependency>
<!-- 同理,如果想要Feign 中使用Okhttp作为网络请求框架,则只需要在porn 文件上加上feign-okhttp 的依赖 feign-httpclient和feign-okhttp只要 使用一种-->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>8.18.0</version>
</dependency>
最后
以上就是生动钢笔为你收集整理的4. restTemplate和ribbon和feign(2刷)的全部内容,希望文章能够帮你解决4. restTemplate和ribbon和feign(2刷)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复