一、注册中心:Eureka,远程调用:Fegin

(一)概念简述:Eureka,提供服务注册,各个微服务可以通过注册中心调用其他微服务的功能接口,包含两个组件EurekaServer、EurekaClient

简单来说,EurekaServe就是提供注册中心的微服务,比如微服务8001通过配置在7001EurekaServer中进行注册,微服务8002通过EurekaClient进行配置来调用8001的功能模块(以下根据这3个微服务进行解释说明)

(二)Eureka实现步骤

1.新建模块7001,引入依赖eureka依赖(springboot、springcloud依赖版本要对应、其他需要的依赖自行引入。我这里父模块版本已经引入了,不会报错。用的是spring boot 2.2.2、spring cloud Hoxton.SR1)
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
2.添加yml配置文件
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
#      集群模式
#      defaultZone: http://eureka7002.com:7002/eureka
#      单机模式
      defaultZone: http://eureka7001.com:7001/eureka
3.编写启动类

这里需要加上@EnableEurekaServer注解,表示该服务是注册中心,

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
        public static void main(String[] args) {
            SpringApplication.run(EurekaMain7001.class,args);
        }
}

启动服务7001,访问
http://localhost:7001/
如果有画面,说明注册中心配置成功。

4.服务8001注册进7001注册中心

新建微服务8001重复第1步
添加yml文件

server:
  port: 8001
# 设置服务名,调用时需要(必须)
spring:
  application:
    name: cloud-payment-service
    
eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
#      集群模式
#      defaultZone: http://eureka7002.com:7002/eureka
#      单机模式
      defaultZone: http://eureka7001.com:7001/eureka

编写启动类

@SpringBootApplication
@EnableEurekaClient   
//@EnableDiscoveryClient   不是用的eureka注册中心的可以使用这个注解
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class,args);
    }
}

访问http://localhost:7001/,注册成功
在这里插入图片描述

(三)Fegin实现步骤(服务9001通过注册中心7001远程调用微服务8001的功能)

1.新建8002

引入openfeign依赖,openfeign服务调用

    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

编写yml

server:
  port: 9001

spring:
  application:
    name: cloud-order-openfeign-service

eureka:
  client:
    register-with-eureka: false
    fetchRegistry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

主启动类

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderFeignMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain9001.class,args);
    }
}
2.编写8001controller
@RestController
@Slf4j
public class PaymentController {
    @GetMapping(value = "/testFeign")
    public String testFeign() {

        return "这是8001的testFeign";
    }
}
2.在9001编写中新建包service中放FeignClient的interface 接口

在这里插入图片描述

@Component  //加入容器
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") //yml中的8001注册服务的名称
public interface PaymentFeignService {
	//复制8001中刚刚编写的需要调用的controller
    @GetMapping(value = "/testFeign")
    public String testFeign();
}
3.在9001编写中controller注入接口调用目标方法
@RestController
public class OrderController {
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/testFeign")
    public String testFeign(){
        return paymentFeignService.testFeign();
    };
}
3.启动微服务7001,8001,8002

访问http://localhost:9001/testFeign
在这里插入图片描述

调用成功

二、负载均衡:Ribbon

(一)概念简述:Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。

(二)轮询实现步骤

1.新建微服务8002重复8001新建步骤:引入依赖、复制8001的yml端口号改为8002、创建主启动类、创建controller

注意这里的return是 “这是8002的testFeign”;

@RestController
@Slf4j
public class PaymentController {
    @GetMapping(value = "/testFeign")
    public String testFeign() {

        return "这是8002的testFeign";
    }
}
2.在9001上加入负载均衡配置类

在这里插入图片描述
这里是轮询的负载均衡
其他基于某种规则的配置或者自定义的负载均衡配置可行添加

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
3.启动7001,8001,8002,9001

Eureka中可以看到服务名为CLOUD-PAYMENT-SERVICE有两个
在这里插入图片描述
此时再次访问http://localhost:9001/testFeign
每次刷新就可以进行轮询调用8001,8002了
在这里插入图片描述
在这里插入图片描述

三、断路器:Hystrix

(一)服务降级:如果服务器故障,或者服务器访问时间较长未响应,应该返回一个友好提示,而不是把错误代码返回给用户

1.错误模拟,看看效果

修改8001controller中的testFeign

    @GetMapping(value = "/testFeign")
    public String testFeign() {
        //模拟线程处理时间较长
        try {
       		 //休眠三秒,超过
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "这是8001的testFeign";
    }

在9001中的yml中设置调用超时时间

ribbon:
  #2秒超时等待
  ReadTimeout: 2000
  ConnecTimeout: 2000

启动,7001,8001,9001
启动访问http://localhost:9001/testFeign

在这里插入图片描述
出现超时错误,返回客户信息,用户体验很差

2.全局的fallback
9001引入hystrix依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
yml开启hystrix支持
feign:
  hystrix:
    enabled: true
主启动类加入@EnableHystrix注解
@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderFeignMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(OrderFeignMain9001.class,args);
    }
}
在9001的调用的interface中加入PaymentFallbackServiceImpl

在这里插入图片描述

编写PaymentFeignService客户端的实现类,调用失败就是执行这个实现类的方法
@Component
public class PaymentFallbackServiceImpl implements PaymentFeignService {
    @Override
    public String testFeign() {
        return "服务器忙,请稍后再试.....";
    }
}
FeignClient 接口类

@FeignClient 上加入 fallback 的方法类,调用失败时,会执行PaymentFallbackServiceImpl这个类的对应的方法

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = PaymentFallbackServiceImpl.class)
public interface PaymentFeignService {
    @GetMapping(value = "/testFeign")
    public String testFeign();
}
重启9001测试

调用就会出现我们上面编写的fallback方法。
在这里插入图片描述

(二)服务熔断:如果服务器故障,调用服务多次未响应时,不应该继续调用服务器的服务,增加被调用的服务器压力,防止级联故障和雪崩,确保服务端到端的性能

1.8001引入依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
2.8001新增controller

参数id传入小于0的数时会报错,大于的数返回随机的流水号serialNumber

4个参数的value 都可以更改,我这里写的大概意思就是10s内10个请求6个以上的错误就会进行熔断措施

    //=====服务熔断
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
    })
    @GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
    public String paymentCircuitBreaker(@PathVariable("id") Integer id){
        if(id < 0)
        {
            throw new RuntimeException("******id 不能负数");
        }
        //生成随机UUID
        String serialNumber = IdUtil.simpleUUID();

        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
3.8001服务提供者加入@EnableCircuitBreaker注解
@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class,args);
    }
}
4.参考服务调用的方式,9001客户端FeignClient中加入

调用微服务8001的paymentCircuitBreaker方法

    @GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
    public String paymentCircuitBreaker(@PathVariable("id") Integer id);

fallback实现类方法

    @Override
    public String paymentCircuitBreaker(Integer id) {
        return "服务器忙,请稍后再试.....";
    }

controller调用

    @GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
    public String paymentCircuitBreaker(@PathVariable("id") Integer id){
        return paymentFeignService.paymentCircuitBreaker(id);
    }
5.重启8001,9001测试

输入大于0的整数1,正常调用
在这里插入图片描述
输入小于0的整数-1,执行fallback方法
在这里插入图片描述
上边说了在服务端controller配置的 @HystrixCommand3个参数的大概意思就是10s内10个请求6个以上的错误就会进行熔断措施
所有我们先发送7个错误的请求,参数输入-1
在这里插入图片描述
我们再发送3个错误的请求,参数输入1,此时还能正常调用
在这里插入图片描述
但是此时已经满足熔断的判断,微服务熔断打开了
再次输入参数输入1,就会执行的fallback方法。
在这里插入图片描述
等待一段时间,hystrix会后台自行判断测试,待服务符合要求后,熔断关闭。恢复正常访问
在这里插入图片描述

学习:https://www.bilibili.com/video/BV18E411x7eT?p=88

demo源码:https://gitee.com/longdada888/springcloud-demo

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐