微服务的远程调用
RestTemplate
在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类。
实例化RestTemplate
创建配置类,实例化RestTemplate
@Configuration
public class RibbonConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
使用RestTemplate
没有负载功能远程调用时,使用要调用方的完整UIL。
private final String URL = "http://localhost:11000/api/type/";
@GetMapping("/findAllTypes")
public HttpResp findAllTypes() {HttpResp body = restTemplate.getForEntity(URL + "findAllTypes",HttpResp.class).getBody();body.setMsg("服务id: " + applicationName + ", 服务port: " + port);return body;
}
Ribbon
Ribbon是一个部署在调用端并在生产的云服务项目中经过考验的进程间通信库。Ribbon主要提供
- 客户端负载均衡
- 容错处理
- 支持多协议的异步通信。支持HTTP、TCP、UDP协议。
- 支持缓存和批量处理
Ribbon的负载均衡策略
随机策略(RandomRule)
从微服务客户端中随机选择一个微服务实例作为RPC请求的目标微服务。
线性轮询策略(RoundRobinRule)
每次都取下一个服务器,假设有n个节点服务器,第一次取1,第二个取第2个服务器,…第n个取第n个服务器,以此类推。
响应时间权重策略(WeightedResponseTimeRule)
为每一个微服务提供者维护一个权重值,规则简单理解为服务器响应时间越长,其权重就越小。
在进行服务器选择时,权重值越小,被选择的机会就越少。
最少连接策略(BestAvailableRule)
选取连接数最少的微服务提供者。
重试策略
在一定时间限制内对服务提供者进行循环重试。
定义Ribbon负载均衡
@LoadBalanced
@Bean(name = "restTemplateWithLB")
public RestTemplate restTemplateWithLB(){return new RestTemplate();
}
使用Ribbon
使用Nacos中注册的serverId替代之前的完整url。moviex-type是nacos中注册的微服务名称唯一ID。
@GetMapping("/findAllTypesx")
public HttpResp findAllTypesx() {HttpResp body = restTemplateNoLB.getForEntity("http://moviex-type/api/type/findAllTypes", HttpResp.class).getBody();body.setMsg("服务id: " + applicationName + ", 服务port: " + port);return body;
}
测试Ribbon
启动两个服务,测试调用这两个微服务是否是负载均衡的,即两个微服务会被轮训的调用。
java -jar -Dserver.port 新端口号 xxxx-1.0-SNAPSHOT.ja
Dockerfile
FROM anapsix/alpine-java:latest
EXPOSE 11000
ADD target/movie-type-1.0-SNAPSHOT.jar /movie-type.jar
ENTRYPOINT ["java","-jar","-Dspring.cloud.nacos.discovery.ip=192.168.198.128","-Dspring.cloud.nacos.discovery.port=11000"]
CMD ["/movie-type.jar"]
OpenFeign
Spring Cloud OpenFeign是一种基于Spring Cloud的声明式REST客户端,它简化了与HTTP服务交互的过程。它将REST客户端的定义转化为Java接口,并且可以通过注解的方式来声明请求参数、请求方式、请求头等信息,从而使得客户端的使用更加方便和简洁。同时,它还提供了负载均衡和服务发现等功能,可以与Eureka、Consul等注册中心集成使用。Spring Cloud OpenFeign能够提高应用程序的可靠性、可扩展性和可维护性,是构建微服务架构的重要工具之一。
使用OpenFeign
引入依赖
openfeign要依赖loadbalance模块。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
定义接口
定义用来被远程调用的接口。
@FeignClient(value = "ssc-cloud-paycenter")
public interface IPaycenterFeign {@GetMapping("/api/paycenter/getByNum")HttpResp<Account> getByNum(@RequestParam("num") long num);
}
调用方
调用方的main启动类添加@EnableFeignClients,注意标注要调用方的openfeign接口包位置(basePackages)。
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients(basePackages = "com.wnhz.ssc.cloud.paycenter.feign")
public class OlderApp {public static void main(String[] args) {SpringApplication.run(OlderApp.class);}
}
调用openfeign接口
@Feign注解
public @interface FeignClient {@AliasFor("name")String value() default "";String contextId() default "";@AliasFor("value")String name() default "";String[] qualifiers() default {};String url() default "";boolean decode404() default false;Class<?>[] configuration() default {};Class<?> fallback() default void.class;Class<?> fallbackFactory() default void.class;String path() default "";boolean primary() default true;
}
序号 | 方法名称 | 作用 |
---|---|---|
1 | name/value | 注册到nacos上的微服务名称id |
2 | url | |
3 | decode404 | 当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException |
4 | configuration | Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract |
5 | fallback | 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口 |
6 | fallbackFactory | 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码 |
7 | path | 定义当前FeignClient的统一前缀,当我们项目中配置了server.context-path,server.servlet-path时使用 |
8 | contextId | 当微服务名冲突时,解决它的唯一名称 |