restTemplate
spring 并未自动加载restTemplate到容器中, 使用需手动加入:
比如这样:
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(){
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
@LoadBalanced是负载均衡的注解, 声明使用Ribbon负载均衡器, 这与nginx有所区别, nginx是服务端负载均衡, 反向代理服务端(是服务端的代理人), ribbon是客户端的代理人.
restTemplate没有自动使用负载均衡, 这里使用@LoadBalanced手动引入Ribbon负载均衡器
Ribbon的本质是一个拦截器, 在调用restTemplate时, LoadBalancerInterceptor这个类将请求拦截, 在拦截器中RibbonLoadBalancerClient代理去查询服务地址, 然后根据策略选取一个地址给restTemplate去调用服务
feign
Feign是Netflix公司开源的轻量级rest客户端, spring将feign和ribbon整合在一起了,因此不需要手动配置负载均衡, 提供的坐标为:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
举个feign调用远程服务的栗子:
启动类:(@EnableFeignClients声明feign客户端)
@EnableFeignClients
@SpringBootApplication
public class ManageCourseApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ManageCourseApplication.class, args);
}
}
dao层接口调用:
@FeignClient(value = "XC-SERVICE-MANAGE-CMS") //需要调用的服务名(eureka注册中心微服务名字)
//和mybatis/jpa一样, 只需写接口或抽象方法,框架动态代理调用
public interface CmsPageClient {
//根据页面id查询页面信息,远程调用cms请求数据
@GetMapping("/cms/page/get/{id}")//用GetMapping标识远程调用的http的请求类型和请求地址
public CmsPage findCmsPageById(@PathVariable("id") String id);
//添加页面,用于课程预览
@PostMapping("/cms/page/save")
public CmsPageResult saveCmsPage(@RequestBody CmsPage cmsPage);
}
feign在三层架构的dao层, 它调用某个远程服务获取数据, 和调用mysql获取数据一样, 只不过此时提供数据的是我们自己写的微服务, 不管什么架构类型, 我们都是在写三层架构, 不过是每层采用了不同的实现
feign虽是dao层, 但其语法和controller层很类似
在类上加上@FeignClient(value = “XC-SERVICE-MANAGE-CMS”), 并指明需要调用的服务名