1,项目目录结构
2,服务提供者
1,依赖
<!-- 服务注册discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
2,启动类
@SpringBootApplication
@EnableDiscoveryClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
//被调用的方法
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
3,配置文件
server.port=8080
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.profiles.active=dev
3,服务的使用者(feign)
1,依赖
<dependencies>
<!-- 服务注册discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<!-- 服务调用openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
</dependencies>
2,启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class App2 {
public static void main(String[] args) {
SpringApplication.run(App2.class, args);
}
}
3,调用使用的接口
@FeignClient的参数为被调用的服务名
@Component
@FeignClient("service-provider")
public interface OrdersClient {
//和服务提供者的方法全路径相同
@GetMapping("/echo/{string}")
public String echo(@PathVariable("string") String string);
}
4,使用
@Controller
public class TestController {
@Autowired
private OrdersClient ordersClient;
@RequestMapping("getString")
@ResponseBody
public String getString(){
String echo = ordersClient.echo("666");
return echo;
}
}
4,熔断(hystrix)
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
1,依赖
其中ribbon起到了负载均衡的作用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
2,orderClient接口
name 属性指定服务名,此处结合ribbon可实现负载
fallback 指定服务挂掉时执行的实现类
@Component
@FeignClient(name = "service-provider",fallback = OrdersClientImpl.class)
public interface OrdersClient {
//和服务提供者同名方法
@GetMapping("/echo/{string}")
public Integer echo(@PathVariable("string") String string);
}
2,实现orderclient的实现类OrdersClientImpl,当service-provider挂掉时,自动执行。
@Component
public class OrdersClientImpl implements OrdersClient {
@Override
public Integer echo(String string) {
return 404;
}
}
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。所以,对Spring Cloud Ribbon的理解和使用,对于我们使用Spring Cloud来构建微服务非常重要。
在这一章中,我们将具体介绍如何使用Ribbon来实现客户端的负载均衡,并且通过源码分析来了解Ribbon实现客户端负载均衡的基本原理。