4. restTemplate和ribbon和feign(2刷)

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>
		
对于在Spring应用程序中进行HTTP调用的选项,FeignRestTemplate都是常见的选择。这两个库都可以用来实现客户端调用其他服务的功能,但它们有一些区别。 Feign是一个声明式的HTTP客户端,使用注解来定义和配置请求。它集成了Ribbon和Hystrix,可以与Eureka等服务注册中心和负载均衡器无缝配合使用。Feign简化了HTTP调用的配置和使用,使得编写客户端代码更加简洁和易读。 RestTemplateSpring框架中的一个同步HTTP客户端,提供了丰富的API来进行HTTP请求和处理响应。它可以与其他Spring功能集成,如Spring MVC和Spring Boot。RestTemplate相对于Feign更加底层,更灵活,可以手动配置各种参数和拦截器。 选择使用哪个库取决于你的具体需求。如果你希望更简洁、更易于使用的API,并且与Spring Cloud的其他组件无缝集成,那么Feign是一个不错的选择。如果你需要更多的灵活性和自定义配置,并且不依赖于Spring Cloud的其他组件,那么RestTemplate可能更适合你。 另外,还要考虑到项目的现状和未来发展方向。如果你正在使用Spring Cloud或者计划将其引入到项目中,那么Feign可能更加符合整体架构。但如果你的项目已经使用了RestTemplate,并且没有特别需要引入Feign的理由,那么可以继续沿用RestTemplate。 总之,FeignRestTemplate都是可行的选择,具体取决于你的需求、技术栈和项目背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值