SpringCloud/Ribbon负载均衡器/Feign/Hystrix断路器/Zuul网关/config 分布式配置_快敲代码去-程序员宅基地

技术标签: java  ribbon  

SpringCloud/Ribbon负载均衡器/Feign/Hystrix断路器/Zuul网关/config 分布式配置

在上一篇帖子中我们集成了Eureka注册中心及其集群,提供者(pay)服务,消费者服务(pay),也就是springcloud的基本入门。

跳转:https://blog.csdn.net/weixin_45561263/article/details/104347501

今天让提供者服务和消费者服务之间进行通信,再搭建一下由5部分组成的重要结构

一、服务之间的通信

添加公共模块,其他模块依赖公共模块即可

1、搭建公共的User-common模块

编写domain/user,添加id、username、password字段作为测试

2、pay-server 和 user-server 依赖 user-common

<dependency>
            <groupId>cn.itsource</groupId>
            <artifactId>springboot-common-user</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

3、user-server编写controller 返回User对象

@Controller
public class UserProviderController {
    
    /**
     * 提供者方法,由消费者调用
     */
//    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    @GetMapping("/user/{id}")//该注解等同于上面注解
    @ResponseBody
    public User getUserById(@PathVariable("id") Long id){
    
        return new User(id,"这是个姓名","123456  端口 1000");
    }

}

4、pay-server 支付服务准备RestTemplate的Bean

我们使用在主配置类中添加

/*
* RestTemplate:是Spring封装的一个基于Rest风格的Http客户端工具
*/
@Bean
public RestTemplate restTemplate(){
    
    return new RestTemplate();
}

5、pay-server编写controller

@Controller
public class ConsumerPayController {
    

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/pay/{id}")
    @ResponseBody
    public User getUserById(@PathVariable("id") Long id){
    
        //通过ip:端口调用
        String url = "http://localhost:1000/user/"+id;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }


}

这里浏览器地址栏输入:http://localhost:2000/pay/+id 就可以访问

但是我们发现一个问题,这里通过pay-server调用user-server 并没有经过注册中心,后面给user-server集群并添加负载均衡器来解决这个问题

二、Ribbon负载均衡器

在这里插入图片描述

1、先对user-server做个集群,再集成ribbon负载均衡器

新建项目,和user-server-1000一样。只是端口和配置文件中的instance-id不一致

2、Ribbon集成(和pay-server集成)

可以直接从官网找到集成步骤

https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#_how_to_include_hystrix

在这里插入图片描述

1.导包
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.修改RestTemplate的Bean的定义

在pay-server服务配置类中RestTemplate的Bean方法上添加@LoadBalanced标签

@LoadBalanced:ribbon的负载均衡标签,赋予RestTemplate有负载均衡的能力

3.修改Controller调用方式
//String url = "http://localhost:1000/user/"+id;
//修改如下
String url = "http://user-server:1000/user/"+id;

ip改为user-server,user-server为user-server服务的服务名,Ribbon通过这个去注册中心获取服务清单,根据清单获取ip和端口,默认使用轮询算法分配服务。

调用:localhost:2000/pay/具体id

三、Feign

Feign底层是Ribbon,是对Ribbon的封装一个框架,使用更加简单,不需要像Ribbon那样拼凑URL。

1.重新建项目集成Feign,步骤略

2.导包

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

3.配置类开启Feign支持@EnableFeignClients

@SpringBootApplication
@EnableFeignClients//开启Feign
public class OrderApplicationConfig4000 {
    

    public static void main(String[] args) {
    
        SpringApplication.run(OrderApplicationConfig4000.class);
    }
}

4.编写接口

/**
*	接口上打: @FeignClient(value = "user-server") :目标服务的名字
* 	接口中方法:跟目标服务的controller中的方法一致
**/
@FeignClient(value = "user-server")
public interface UserFeignClient {
    

    //要调用的服务的Controller中的方法,建议直接拷贝过来:
    //1.url要一样 , 2参数要一样 , 3返回值要一样
    @GetMapping("/user/{id}")
    User getUserById(@PathVariable("id") Long id);
}

– Feign客户端接口的方法和目标服务的对应的方法要完全一致 –

5.编写controller: 注入 Fiegn接口,实现服务调用

@Controller
public class OrderController {
    

    //注入接口
    @Autowired
    private UserFeignClient userFeignClient;


    @GetMapping("/order/{id}")
    @ResponseBody
    public User getUserById(@PathVariable("id") Long id){
    
        return userFeignClient.getUserById(id);
    }
}

浏览器地址输入:localhost:4000/order/具体id

四、Ribbon集成Hystrix

Hystrix,断路器

用来解决因一个服务器崩溃导致众多服务器接连崩溃的雪崩效应

hystrix 通过如下机制来解决雪崩效应问题:

  1. 资源隔离(限流):包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
  2. 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
  3. 降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
  4. 缓存:提供了请求缓存、请求合并实现。

Ribbon集成 pay-server

1.导入依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
2.controller方法上添加注解
@HystrixCommand(fallbackMethod = "getUserByIdFallback")

getUserByIdFallback是托底方法名


 /**
    *   准备一个托底方法  getUserByIdFallback  托底方法的参数和返回结果要和原方法一致
    */
    @ResponseBody
    public User getUserByIdFallback(@PathVariable("id") Long id){
    
        return new User(-1L,"没有此用户","无此用户,没有密码");
    }

这样就集成成功了

我们关闭user-server模拟提供服务器故障,这样它会调用托底方法,返回一个提示,如图

在这里插入图片描述

五、Feign集成Hystrix

Feign集成 order-server

1.不需要导包,因为openfeign包里面已经存在
2.配置文件yml里添加feign
feign:
  hystrix:
    enabled: true #开启熔断支持
# 出现超时问题  将时间改大即可 如下 或者百度    
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000
2.修改Fiegn客户端接口@FeignClient标签
@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class)

fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类

3.托底实现类
/**
 * 该类是接口的实现类
 */
@Component//一定要加这个注解
public class UserFeignClientFallback implements UserFeignClient {
    

    @Override
    public User getUserById(Long id) {
    
        return new User(-1L,"不存在此用户","无用户,无密码");
    }
}

在这里插入图片描述

原理同上

六、zuul的集成

路由网关,请求分发,监控

1.新建项目zuul-server

先注册到注册中心

2.导包

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

3.主配置类上添加@EnabelZuulProxy标签

@EnableZuulProxy

4.yml里添加配置

zuul:ignored-services 忽略使用服务名的方式访问

routes :指定服务的访问路径

zuul:
  #prefix: "/hrm"  # 前缀可加可不加
  ignored-services: "*" #禁止浏览器 使用服务名的方式去访问目标服务
  routes:
    pay-server: "/pay/**" # pay-server这个服务使用 /pay路径去访问
    order-server: "/order/**" #order-server这个服务使用 /order 路径去访问

访问路径:http://zuul的ip:zuul的port/服务名字/资源路径

在这里插入图片描述

七、config 分布式配置

1、新建项目springcloud-config-server-6000

注册到Eureka注册中心

2、导入依赖

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>

3、主配置类上添加@EnableConfigServer 开启配置服务

@EnableConfigServer

4、yml配置文件

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:3000/eureka/,http://localhost:3001/eureka/  #注册中心地址
  instance:
    prefer-ip-address: true  #使用真实ip显示
    instance-id:  config-server:6001
# 端口
server:
  port: 6001

spring:
  application:
    name: config-server   # 应用的名字
  cloud:
    config:
      server:
        git:
          uri: 这里填远程仓库链接地址(Git、码云等等)
          # 仓库是公开的就不需要用户名密码
          username: 远程仓库网址的登陆用户名
          password: 远程仓库网址的登陆密码

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45561263/article/details/104349726

智能推荐

随便推点