• SpringCloud


    相关资料
    springcoud入门
    springcoud入门
    Eureka
    Ribbon
    Eureka集群
    Hystrix
    gateway
    gateway过滤器

    SpringCloud的五大功能

    • Eureka:服务治理组件,包含服务注册与发现
    • Ribbon:客户端负载均衡的服务调用组件
    • Hystrix:容错管理组件,实现了熔断器
    • Zuul:网关组件,提供智能路由、访问过滤等功能
    • Config:外部化配置组件

    一个文件夹整合整个项目

    • 新建一个maven项目
    • 把src删了,把pom.xml改了
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.1.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.pdt</groupId>
    <artifactId>pdt</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    
    • 后续的所有模块都添加在这个文件夹里,用module新建maven项目
    • 如果没有多个域名的服务器做测试需要在本地把host文件改了
    127.0.0.1 eureka7001
    127.0.0.1 eureka7002
    127.0.0.1 eureka7003
    

    Eureka中的三大角色

    • Eureka Server:服务的注册与发现
    • Service provider 服务的提供者,将服务注册到Eureka,当中
    • Servce consumer 服务发消费者 ,从Eureka服务列表中获得服务,然后进行消费

    Eureka管理者,就是zookeeper

    image.png

    • 其实就是这个maven
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    ###服务端口号
    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001
      client:
        fetch-registry: false # 不用检索服务 自己是注册中心
        register-with-eureka: false #不向注册中心注册自己
        // 服务端集群配置
        service-url:
          defaultZone: http://eureka7001:7001/eureka
    
    @EnableEurekaServer
    @SpringBootApplication
    public class Eureka7001Application {
        public static void main(String[] args) {
            SpringApplication.run(Eureka7001Application.class,args);
        }
    }
    
    • 启动后访问http://localhost:7001看到一个网站

    image.png

    Eureka功能提供者

    image.png

    • 其实就是这个maven
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    # 服务提供者yml配置
    server:
      port: 8001
    
    spring:
     application:
       name: provider
    
    eureka:  #设置eureka注册服务的地址
      client:
        service-url:
           defaultZone: http://eureka7001:7001/eureka/
      instance:
        instance-id: microservice-provider-dept-8001 #配置服务的别名
        prefer-ip-address: true # 注册的时候使用ip注册
    
    @SpringBootApplication
    @EnableEurekaClient
    public class provider{
        public static void main(String[] args) {
            SpringApplication.run(provider.class, args);
        }
    }
    
    • 暴露服务,就是正常的一个MVC接口就行
    • 把上面的功能模块启动后,就能在服务管理者刚才的网站上看到一个provider服务

    Eureka消费者

    • 跟功能提供者一样的新建思路,maven依赖也一样
    • 添加ribbon的maven依赖,ribbon往下看,这里直接用
    • 功能提供者也能是消费者,相互调用
    • 这是是表示入口消费者,也就是自定义网关,需要有一个入口把所有的服务都总结起来,所有人都访问这个入口就行,如果有多个一样的入口,就需要用nginx轮询代理
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
    
    • yml配置
    server:
      port: 80
    
    eureka:
      client:
        service-url:
           #eureka发现服务的列表
           defaultZone: http://eureka7001:7001/eureka
        #自己不能注册 自己只需要通过eureka发现服务
        register-with-eureka: false
    
    • 修改入口文件,添加注解
    @SpringBootApplication
    @EnableDiscoveryClient
    public class consumer{
        public static void main(String[] args) {
            SpringApplication.run(consumer.class, args);
        }
    
        @Bean
        @LoadBalanced
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
    
    @Service
    public class testService {
        @Autowired
        RestTemplate restTemplate;
    
        public String test(String name) {
            // 把服务提供者的spring.application.name填进来 + service名字
            String str = restTemplate.getForObject("http://provider/test,String.class,name);
            return str; 
        }
    }
    

    Ribbon
    负载均衡的功能模块,这里有个知识点,负载均衡有两种模式,一种是集中式,一种是进程式,nginx就是集中式,由nginx安排请求给服务,而ribbon是进程式,请求先获取我有几个服务可以选,然后自己选,具体怎么用

    • 服务提供者复制几份一样的,只修改自己的端口,其他不变
    • 给消费者添加ribbon的maven依赖,添加注解@LoadBalanced就行了
    • 这个默认是使用轮询的,也可以自定义

    gateway

    • 因为自定义网关太麻烦了,所以需要使用专业网关zuul
    • 这个是zuul的升级版,现在用这个了
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    server:
      port: 80
    spring:
      application:
        name: gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true
    eureka:
      client:
        service-url:
          defaultZone: http://eureka7001:7001/eureka/
    
    • 就依赖和配置启动就行,然后刷新eureka控制台可以看到服务,访问http://localhost/ORDER/xxx就能看到效果,中间的注册ID是大写的
    • 过滤器,比如白名单,黑名单,登陆状态等等
    // 全局过滤器
    @Component
    public class MyGlobalFilter implements GlobalFilter, Ordered {
        @Override
        public int getOrder() {
            return 0;
        }
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            RequestPath path = exchange.getRequest().getPath();
            System.out.println(path);
            return chain.filter(exchange);
        }
    }
    

    Eureka-server集群

    • 复制几份,【7001,7002,7003】,修改配置
    server:
      port: 7001
    
    eureka:
      instance:
        hostname: eureka7001
      client:
        fetch-registry: false # 不用检索服务 自己是注册中心
        register-with-eureka: false #不向注册中心注册自己
        service-url:
          defaultZone:  http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
    
    server:
      port: 7002
    
    eureka:
      instance:
        hostname: eureka7002
      client:
        fetch-registry: false # 不用检索服务 自己是注册中心
        register-with-eureka: false #不向注册中心注册自己
        service-url:
          #集群版本 配置7001 7003eureka服务的地址信息
          defaultZone:  http://eureka7001:7001/eureka,http://eureka7003:7003/eureka
    
    server:
      port: 7003
    
    eureka:
      instance:
        hostname: eureka7003
      client:
        fetch-registry: false # 不用检索服务 自己是注册中心
        register-with-eureka: false #不向注册中心注册自己
        service-url:
          defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka
    
    • 修改所有服务提供者的配置
    eureka:  #设置eureka注册服务的地址
      client:
        service-url:
            defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
    
    • 修改所有服务消费者的配置
    eureka:
      client:
        service-url:
    #eureka发现服务的列表
           defaultZone:  http://eureka7001:7001/eureka,http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
    

    image.png

    Hystrix
    熔断机制,就是在同个服务的同个类里添加处理异常的方案,目的是为了在链式调用里防止某个环节断裂

    • 在【Eureka消费者】不变的情况下加maven依赖
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>
    
    • 在原来的基础上改入口文件添加注解
    @EnableCircuitBreaker
    public class TestApp {
       ...
    }
    
    • 在原来的基础上改代码
    @Service
    public class testService {
    
        @Autowired
        RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "testHystrix")
        public String test(String name) {
            String str = restTemplate.getForObject("http://app-item/item,String.class,name);
            sout(str)
            return str; 
        }
    
        public String testHystrix(String name) {
            return "熔断了"; 
        }
    }
    

    config

    • 集体配置,让客户端访问服务端,服务端再去访问git/svn,好像没什么意义

    nacos

    • 阿里的Eureka,跟zk一样是下载个服务,启动后当做远程注册机

    Feign

    • 这个是ribbon的升级版
    • 麻烦

    Sentinel

    • 阿里的Hystrix
  • 相关阅读:
    CEPH篇 目录
    kubernetes篇 容器用户权限控制
    深度学习篇-如何理解置信区间
    Mac软件安装篇 for Mac
    JAVA进阶篇 内存模型
    负载均衡篇 不同层次的负载均衡(2/3/4/7)
    NETTY篇 一篇文章看懂NETTY
    base64加密后无法解密
    Spring-Cloud-Gateway 从升级到放弃
    spring gateway 截取response 长度缺失
  • 原文地址:https://www.cnblogs.com/pengdt/p/13523359.html
Copyright © 2020-2023  润新知