精华内容
下载资源
问答
  • 服务治理
    千次阅读
    2022-01-26 20:41:57

    对于服务治理概念的一些总结和理解,我们应该如何实践服务治理


    1、什么是服务治理

    服务治理企业为了确保事情顺利完成而实施的过程,包括最佳实践,架构原则,治理规程,规律等
    为什么服务需要治理呢,只有服务之间存在问题了,才需要治理
    当然了,服务本身,也是存在一些问题,需要治理的

    2、服务治理中的一些典型问题

    1、投产比:交付价值和利益相关,这是投入产出比的问题
    2、审计:对于标准和章程是否可以遵守
    3、隐患:服务变更容易引起不可预见的后果,如果让后果最小化
    4、质量:可用性,扩展性等<

    更多相关内容
  • 服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张...
  • 信息技术服务 治理第 5 部分:数据治理规范
  • 信息技术服务 治理 第5部分:数据治理规范.pdf
  • 1.什么是苔藓1.1什么是服务治理服务治理,我也称为微服务治理,是指用来管理微服务的整个生命周期。包括应用的创建,服务名的规范,服务的上下线,服务的迁移,整个服务的生老病死等方方面面的治理。1.2苔藓概述莫斯...
  • Dubbo分布式服务治理实战.pdf
  • 管理这些服务方案则叫服务治理。 现在在Server上有四项服务,分别为 UserService ShopService GoodsService LiveService 这些服务我们叫它服务提供者(既提供对内服务的应用) 调用服务的应用我
  • IT治理审计导则,本部分规定了信息技术审计总则、审计组织管理、审计人员、审计流程、审计报告、审计使用对象和范围等内容
  • 史上最强Dubbo面试26题和答案:核心组件+服务治理+架构设计等
  • 1.1 服务治理的发展历程 ➢ 1.2 全方位的服务治理 ➢ 1.3 服务治理原则和目标 ➢ 1.4 服务度量体系 ➢ 1.5 线上/线下服务治理主要内容和方法 ➢ 1.6 敏捷服务研发团队的治理
  • Dubbo是主流的采用RPC方式的分布式服务治理架构之一,实现了分布式服务注册、服务治理和服务监控等功能。通常需结合开源的Zookeeper、Redis或阿里数据库来完成注册中心的功能。
  • 余额宝负责人的来后分享。余额宝背后的服务治理技术干货。为什么需要业务中台。复杂的业务架构如何去实现。你在宿松挺低腹部剧目者居多
  • 大规模redis集群的服务治理之路.pdf
  • 由于微服务细粒度的服务拆分方式和去中心化的架构设计相比于传统SOA架构更适合当前互联网敏捷开发、快速迭代的需求,但是传统微服务的服务治理技术难以实现不同技术框架和通讯协议建设的服务之间互联互通,并且存在...
  • 饿了么的服务治理

    2018-01-31 16:35:22
    饿了么的服务治理 饿了么。服务治理、配置中心、负载均衡
  • 以下是在2006年时IBM对于服务治理要点的总结:l服务定义(服务的范围、接口和边界)l服务部署生命周期(各个生命周期阶段)l服务版本治理(包括兼容性)l服务迁移(启用和退役)l服务注册中心(依赖关系)l服务消息...
  • 信息技术服务 治理 第3部分:绩效评价
  • 服务治理工具dubbo

    2018-06-26 19:36:39
    服务治理工具dubbo,欢迎学习爱好者下载资源,共同学习。。
  • dubbo服务治理

    2018-02-27 18:24:21
    dubbo服务治理的原理,doubbo怎么把一个项目管理成分布式项目等等技术
  • 服务治理和注册

    千次阅读 2022-03-13 11:06:51
    三、服务消费者注册 1、建module 2、pom 3、yml 4、主启动类 5、controller 6、验证测试 四、三个注册中心的异同点 一、Eureka 一、Eureka基础知识 1、什么是服务治理 Spring Cloud 封装了 Netflix 公司开发的 ...

    目录

    一、Eureka

    一、Eureka基础知识

    1、什么是服务治理

    2、什么是服务注册

    3、Eureka的两个组件

    二、构建单机的Eureka步骤

    1、生成eurekaServier端的服务注册中心

    2、将服务提供者provider注册进eurekaServer

    3、将消费者consumer注册进EredaServer

    三、构建Eureka集群

     1、在新建一个eurekaServer服务器(cloud-eureka-server7002)

    2、将服务者Provider8002集群构建

    3、将两台provider发布到上面的两台eureka集群配置中

    4 、将consumer发布到eureka集群中

    四、actuator微服务信息完善

    1、主机名称:服务名称修改

     2、显示IP

    五、服务发现

    六、eureka的自我保护

    1、概述

    2、禁用eureka的自我保护

    3、测试

    二、zookeeper

    一、将服务生产者注册进zookeeper

    1、建module

    2、改pom

    3、写yml

    4、主启动

    5、controller

    6、测试

     二、服务消费方注册进zookeeper

    1、建module

    2、改pom

    3、写yml

    4、主启动

    5、controller

    6、测试

     三、consul

    一、简介和安装

    1、简介

     二、服务提供者注册

    1、建module

    2、pom

    3、yml

    4、主启动类

    5、controller

    6、验证测试

    三、服务消费者注册

    1、建module

    2、pom

    3、yml

    4、主启动类

    5、controller

    6、验证测试

    四、三个注册中心的异同点



    一、Eureka

    一、Eureka基础知识

    1、什么是服务治理

    Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理
    在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册

    2、什么是服务注册

    Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
    在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息 比如 服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址))

    eureka的架构图

    3、Eureka的两个组件

    • Eureka Server提供服务注册服务

    各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。


    • EurekaClient通过注册中心进行访问

    是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

    二、构建单机的Eureka步骤

    1、生成eurekaServier端的服务注册中心

    • 建module

    module名称为cluod_eureka_server7001

    • 改pom
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    • 写yml
    server:
      port: 7001
    eureka:
      instance:
        hostname: localhost
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        fetch-registry: false
        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    • 主启动
    @SpringBootApplication
    @EnableEurekaServer
    public class ApplicationEureka_service {
        public static void main(String[] args) {
            SpringApplication.run(ApplicationEureka_service.class,args);
        }
    }
    • 测试

    在浏览器输入http://localhost:7001进入管理台

    结果页面

    2、将服务提供者provider注册进eurekaServer

    • 改pom

    加入该坐标

    dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    • 写yml
    server:
      port: 8001
    spring:
      application:
        name: provider_payment8001
      datasource:
        url: jdbc:mysql://localhost:3306/xiaojiang?serverTimezone=UTC
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    mybatis:
      #指定映射文件的位置
      mapper-locations: classpath:mapper/*.xml
      #type-aliases-package: org.example.
    
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:7001/eureka/
    • 主启动
    @SpringBootApplication
    @EnableEurekaClient
    public class Cloud_provider_payment8001Application {
        public static void main(String[] args) {
            SpringApplication.run(Cloud_provider_payment8001Application.class,args);
        }
    }
    • 测试

    在浏览器输入http://localhost:7001进入管理台

    3、将消费者consumer注册进EredaServer

    • 改pom
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    • 写yml
    server:
      port: 81
    
    spring:
      application:
        name: comsumer_order
    
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        #eureka服务端的地址
        service-url:
          defaultZone: http://localhost:7001/eureka/
    • 主启动
    @SpringBootApplication
    @EnableEurekaClient
    public class ApplicationConsmer {
        public static void main(String[] args) {
            SpringApplication.run(ApplicationConsmer.class,args);
        }
    }
    • 测试

    在浏览器输入http://localhost:7001进入管理台

    三、构建Eureka集群

     1、在新建一个eurekaServer服务器(cloud-eureka-server7002)

    • 改pom
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    • 写yml

    7001的yml

    server:
      port: 7001
    eureka:
      instance:
        hostname: eureka7001.com
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        fetch-registry: false
        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
        service-url:
          defaultZone: http://eureka7002.com:7002/eureka/

    7002的yml

    server:
      port: 7002
    eureka:
      instance:
        hostname: eureka7002.com
      client:
        #false表示不向注册中心注册自己
        register-with-eureka: false
        #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
        fetch-registry: false
        #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/
    • 修改hosts文件

    在C:\Windows\System32\drivers\etc下的hosts文件,这样就可以通过

    http://eurka7002.com:7002来访问服务器的管理台了

    127.0.0.1 eureka7001.com
    127.0.0.1 eureka7002.com

    • 主启动
    @SpringBootApplication
    @EnableEurekaServer
    public class ApplicationEureka_service7002 {
        public static void main(String[] args) {
            SpringApplication.run(ApplicationEureka_service7002.class,args);
        }
    }

    2、将服务者Provider8002集群构建

    这个服务者与上面的provider8001几乎相同所以也可将provider8001端口改为8002重新发布即可

    • 改pom
    <dependency>
        <groupId>org.example</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <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.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!--mysql-connector-java-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--jdbc-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    • 写yml
    server:
      port: 8002
    spring:
      application:
        name: provider-payment
      datasource:
        url: jdbc:mysql://localhost:3306/xiaojiang?serverTimezone=UTC
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    mybatis:
      #指定映射文件的位置
      mapper-locations: classpath:mapper/*.xml
      #type-aliases-package: org.example.
    
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
    • 主启动
    @SpringBootApplication
    @EnableEurekaClient
    public class Cloud_provider_payment8002Application {
        public static void main(String[] args) {
            SpringApplication.run(Cloud_provider_payment8002Application.class,args);
        }
    }
    • 业务类直接从provider8001中粘贴

    3、将两台provider发布到上面的两台eureka集群配置中

    service-url: defaultZone:改为两台eureka的IP即可

    spring.application.name最好相同

    server:
      port: 8002
    spring:
      application:
            #一定要是中划线,不能是下划线
        name: provider-payment
      datasource:
        url: jdbc:mysql://localhost:3306/xiaojiang?serverTimezone=UTC
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    mybatis:
      #指定映射文件的位置
      mapper-locations: classpath:mapper/*.xml
      #type-aliases-package: org.example.
    
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
    
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

    4 、将consumer发布到eureka集群中

    yml与上面相同做法将service-url: defaultZone:改为两台eureka的IP即可

    controller和conf要更改,启动负载均衡,默认为轮询

    • controller修改

    服务提供端的地址不能写死,否则不能有集群的效果,改为

    spring: application:
           name: provider-payment

    //public static final String PaymentSrv_URL = "http://localhost:8001";
    public static final String PaymentSrv_URL = "http://PROVIDER-PAYMENT";
    •  conf的修改
    public class ApplicationContextConfig {
        @Bean
        @LoadBalanced   //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

    四、actuator微服务信息完善

    1、主机名称:服务名称修改

    • 由于现在,会显示主机名不安全

    •  修改yml
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          defaultZone: http://eureka7002.com:7002/eureka/
      instance:
        instance-id: payment8001
    • 修改后

     2、显示IP

    • 修改前

    • yml文件
    eureka:
      client:
        #表示是否将自己注册进EurekaServer默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true。
        #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetch-registry: true
        service-url:
          defaultZone: http://eureka7002.com:7002/eureka/
      instance:
        instance-id: payment8001
        #访问路径可以显示IP地址
        prefer-ip-address: true
    • 修改后

    五、服务发现

    对于注册进eureka里面的微服务,可以通过服务发现来获得该服务的信息

    • 更改controller
    @Resource
        DiscoveryClient discoveryClient;
    @GetMapping(value = "/discovery")
        public Object discovery()
        {
            List<String> services = discoveryClient.getServices();
            for (String element : services) {
                System.out.println(element);
            }
    
            List<ServiceInstance> instances = discoveryClient.getInstances("PROVIDER-PAYMENT");
            for (ServiceInstance element : instances) {
                System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t"
                        + element.getUri());
            }
            return this.discoveryClient;
        }
    • 主启动类
    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class Cloud_provider_payment8001Application {
        public static void main(String[] args) {
            SpringApplication.run(Cloud_provider_payment8001Application.class,args);
        }
    }

    六、eureka的自我保护

    1、概述

    保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
    如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.
    RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE

    一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存 

    2、禁用eureka的自我保护

    再服务器进行如下配置就行

    server:
      enable-self-preservation: false

    3、测试

    在生产者服务端8002进行以下配置就行

     instance:
      #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
        lease-renewal-interval-in-seconds: 1
      #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
        lease-expiration-duration-in-seconds: 2

    二、zookeeper

    一、将服务生产者注册进zookeeper

    1、建module

    新建一个cloud-provider-payment8004maven模块

    2、改pom

    由于spring-cloud-starter-zookeeper中的zookeeper的jar包与我所使用的的zookeeper版本冲突,

    所以排除掉了,自己导入了一个包

    有由于我这里日志文件slf4j-log4j12和logback-classic冲突所以又排除掉了slf4j-log4j12

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    

    3、写yml

    server:
      port: 8004
    
    spring:
      application:
        name: provider-payment
      cloud:
        zookeeper:
          #zookeeper注册中心的IP和地址
          connect-string: 192.168.195.128:2181

    4、主启动

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

    5、controller

    @RestController
    public class PaymentController {
        @Value("${server.port}")
        private String serverPort;
    
        @RequestMapping(value = "/payment/zk")
        public String paymentzk()
        {
            return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();
        }
    }

    6、测试

      ./zkCli.sh 进入到客户端,用 ls / 来查看有几个节点,用ls /service 就能查看注册进的服务了

     二、服务消费方注册进zookeeper

    1、建module

    建一个cloud-consumerzk-order的maven模块

    2、改pom

    与上面相同

    3、写yml

    server:
      port: 81
    
    spring:
      application:
        name: comsumer-order
      cloud:
        zookeeper:
          connect-string: 192.168.195.128:2181

    4、主启动

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

    5、controller

    配置类

    @Configuration
    public class ApplicationConf {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    }

    controller

    @RestController
    public class orderController {
        public static final String PROVIDER_URL="http://provider-payment";
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/consumer/payment/zk")
        public String paymentInfo()
        {
            String result = restTemplate.getForObject(PROVIDER_URL+"/payment/zk", String.class);
            System.out.println("消费者调用支付服务(zookeeper)--->result:" + result);
            return result;
        }
    
    }

    6、测试

     三、consul

    一、简介和安装

    1、简介

    https://www.consul.io/intro/index.html  这是consul的官方文档

    1. 服务发现:提供HTTP和DNS两种发现方式。
    2. 健康监测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
    3. kv存储:Key、Value的存储方式
    4. 多数据开发:支持多数据中心
    5. 可视化web界面

    下载地址

    Downloads | Consul by HashiCorphttps://www.consul.io/downloads.html

     二、服务提供者注册

    1、建module

    新建cloud-consul-provider8005moudule

    2、pom

    添加坐标

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

    3、yml

    server:
      port: 8005

    spring:
      application:
        name: consul-provider
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            service-name: ${spring.application.name}

    4、主启动类

    与上面一致

    5、controller

    与上面一致

    6、验证测试

    三、服务消费者注册

    1、建module

    新建cloud-consul-provider8005moudule

    2、pom

    添加坐标

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

    3、yml

    server:
      port: 82
    spring:
      application:
        name: consul-order
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            service-name: ${spring.application.name}
    

    4、主启动类

    与上面一致

    5、controller

    @RestController
    public class ConsulController {
        public static final String PROVIDER_URL="http://consul-provider";
    
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping("/consumer/payment/consul")
        public String paymentInfo()
        {
            String result = restTemplate.getForObject(PROVIDER_URL+"/payment/consul", String.class);
            System.out.println("消费者调用支付服务(zookeeper)--->result:" + result);
            return result;
        }
    }

    6、验证测试

    四、三个注册中心的异同点

    1、CAP简介

    C:Consistency(强一致性)

    A:Availability(可用性)

    P:Partition tolerance(分区容错性)

    CAP理论关注粒度是数据,而不是整体系统设计的策略

    2、CAP的说明

    AP(Ereka)

    当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。
    结论:违背了一致性C的要求,只满足可用性和分区容错,即AP

     CP(zookeeper/Consul)

    当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
    结论:违背了可用性A的要求,只满足一致性和分区容错,即CP

    3、异同

    展开全文
  • 快手服务治理平台架构,出自架构师大会的产出,对于互联网从业者有助。
  • #资源达人分享计划#
  • 余额宝背后的服务治理架构.zip
  • dubbo面试题28题详解,专注于服务治理,架构设计问题解决,为你解决面试中遇到的难题。解答面试中各种常见的问题。
  • 基于dubbo的微服务管理平台搭建过程,包含全部配置文件...
  • 微服务之服务治理

    万次阅读 2019-06-24 15:38:12
    服务描述 https://blog.csdn.net/haponchang/article/details/90746408 注册中心 https://blog.csdn.net/haponchang/article/details/93467008 服务框架 ...

    相关文章

    服务描述   https://blog.csdn.net/haponchang/article/details/90746408

    注册中心   https://blog.csdn.net/haponchang/article/details/93467008

    服务框架   https://blog.csdn.net/haponchang/article/details/93468031

    服务监控   https://blog.csdn.net/haponchang/article/details/93469050

    服务追踪   https://blog.csdn.net/haponchang/article/details/93486963

    服务治理   https://blog.csdn.net/haponchang/article/details/93488503

    目录

    微服务的问题

    常用的服务治理手段

    节点管理

    负载均衡

    服务路由

    服务容错


    微服务的问题

    单体应用改造为微服务架构后,服务调用由本地调用变成远程调用,服务消费者 A 需要通过注册中心去查询服务提供者 B 的地址,然后发起调用,这个看似简单的过程就可能会遇到下面几种情况,比如:

    注册中心宕机;

    服务提供者 B 有节点宕机;

    服务消费者 A 和注册中心之间的网络不通;

    服务提供者 B 和注册中心之间的网络不通;

    服务消费者 A 和服务提供者 B 之间的网络不通;

    服务提供者 B 有些节点性能变慢;

    服务提供者 B 短时间内出现问题。

    可见,一次服务调用,服务提供者、注册中心、网络这三者都可能会有问题,此时服务消费者应该如何处理才能确保调用成功呢?这就是服务治理要解决的问题。

     

    常用的服务治理手段

    节点管理

    服务调用失败一般是由两类原因引起的,一类是服务提供者自身出现问题,如服务器宕机、进程意外退出等;一类是网络问题,如服务提供者、注册中心、服务消费者这三者任意两者之间的网络出现问题。

    无论是服务提供者自身出现问题还是网络发生问题,都有两种节点管理手段。

    1. 注册中心主动摘除机制

    这种机制要求服务提供者定时的主动向注册中心汇报心跳,注册中心根据服务提供者节点最近一次汇报心跳的时间与上一次汇报心跳时间做比较,如果超出一定时间,就认为服务提供者出现问题,继而把节点从服务列表中摘除,并把最近的可用服务节点列表推送给服务消费者。

    2. 服务消费者摘除机制

    虽然注册中心主动摘除机制可以解决服务提供者节点异常的问题,但如果是因为注册中心与服务提供者之间的网络出现异常,最坏的情况是注册中心会把服务节点全部摘除,导致服务消费者没有可用的服务节点调用,但其实这时候服务提供者本身是正常的。所以,将存活探测机制用在服务消费者这一端更合理,如果服务消费者调用服务提供者节点失败,就将这个节点从内存中保存的可用服务提供者节点列表中移除。

     

    负载均衡

    一般情况下,服务提供者节点不是唯一的,多是以集群的方式存在,尤其是对于大规模的服务调用来说,服务提供者节点数目可能有上百上千个。由于机器采购批次的不同,不同服务节点本身的配置也可能存在很大差异,新采购的机器 CPU 和内存配置可能要高一些,同等请求量情况下,性能要好于旧的机器。对于服务消费者而言,在从服务列表中选取可用节点时,如果能让配置较高的新机器多承担一些流量的话,就能充分利用新机器的性能。这就需要对负载均衡算法做一些调整。

    常用的负载均衡算法主要包括以下几种。

    1. 随机算法

    顾名思义就是从可用的服务节点中随机选取一个节点。一般情况下,随机算法是均匀的,也就是说后端服务节点无论配置好坏,最终得到的调用量都差不多。

    2. 轮询算法

    就是按照固定的权重,对可用服务节点进行轮询。如果所有服务节点的权重都是相同的,则每个节点的调用量也是差不多的。但可以给某些硬件配置较好的节点的权重调大些,这样的话就会得到更大的调用量,从而充分发挥其性能优势,提高整体调用的平均性能。

    3. 最少活跃调用算法

    这种算法是在服务消费者这一端的内存里动态维护着同每一个服务节点之间的连接数,当调用某个服务节点时,就给与这个服务节点之间的连接数加 1,调用返回后,就给连接数减 1。然后每次在选择服务节点时,根据内存里维护的连接数倒序排列,选择连接数最小的节点发起调用,也就是选择了调用量最小的服务节点,性能理论上也是最优的。

    4. 一致性 Hash 算法

    指相同参数的请求总是发到同一服务节点。当某一个服务节点出现故障时,原本发往该节点的请求,基于虚拟节点机制,平摊到其他节点上,不会引起剧烈变动。

    这几种算法的实现难度也是逐步提升的,所以选择哪种节点选取的负载均衡算法要根据实际场景而定。如果后端服务节点的配置没有差异,同等调用量下性能也没有差异的话,选择随机或者轮询算法比较合适;如果后端服务节点存在比较明显的配置和性能差异,选择最少活跃调用算法比较合适。

     

    服务路由

    对于服务消费者而言,在内存中的可用服务节点列表中选择哪个节点不仅由负载均衡算法决定,还由路由规则确定。

    所谓的路由规则,就是通过一定的规则如条件表达式或者正则表达式来限定服务节点的选择范围。

    为什么要制定路由规则呢?主要有两个原因。

    1. 业务存在灰度发布的需求

    比如,服务提供者做了功能变更,但希望先只让部分人群使用,然后根据这部分人群的使用反馈,再来决定是否做全量发布。这个时候,就可以通过类似按尾号进行灰度的规则限定只有一定比例的人群才会访问新发布的服务节点。

    2. 多机房就近访问的需求

    据我所知,大部分业务规模中等及以上的互联网公司,为了业务的高可用性,都会将自己的业务部署在不止一个 IDC 中。这个时候就存在一个问题,不同 IDC 之间的访问由于要跨 IDC,通过专线访问,尤其是 IDC 相距比较远时延迟就会比较大,比如北京和广州的专线延迟一般在 30ms 左右,这对于某些延时敏感性的业务是不可接受的,所以就要一次服务调用尽量选择同一个 IDC 内部的节点,从而减少网络耗时开销,提高性能。这时一般可以通过 IP 段规则来控制访问,在选择服务节点时,优先选择同一 IP 段的节点。

    那么路由规则该如何配置呢?一般有两种配置方式。

    1. 静态配置

    就是在服务消费者本地存放服务调用的路由规则,在服务调用期间,路由规则不会发生改变,要想改变就需要修改服务消费者本地配置,上线后才能生效。

    2. 动态配置

    这种方式下,路由规则是存在注册中心的,服务消费者定期去请求注册中心来保持同步,要想改变服务消费者的路由配置,可以通过修改注册中心的配置,服务消费者在下一个同步周期之后,就会请求注册中心来更新配置,从而实现动态更新。

     

    服务容错

    服务调用并不总是一定成功的,前面我讲过,可能因为服务提供者节点自身宕机、进程异常退出或者服务消费者与提供者之间的网络出现故障等原因。对于服务调用失败的情况,需要有手段自动恢复,来保证调用成功。

    常用的手段主要有以下几种。

    FailOver

    失败自动切换。就是服务消费者发现调用失败或者超时后,自动从可用的服务节点列表总选择下一个节点重新发起调用,也可以设置重试的次数。这种策略要求服务调用的操作必须是幂等的,也就是说无论调用多少次,只要是同一个调用,返回的结果都是相同的,一般适合服务调用是读请求的场景。

    FailBack

    失败通知。就是服务消费者调用失败或者超时后,不再重试,而是根据失败的详细信息,来决定后续的执行策略。比如对于非幂等的调用场景,如果调用失败后,不能简单地重试,而是应该查询服务端的状态,看调用到底是否实际生效,如果已经生效了就不能再重试了;如果没有生效可以再发起一次调用。

    FailCache

    失败缓存。就是服务消费者调用失败或者超时后,不立即发起重试,而是隔一段时间后再次尝试发起调用。比如后端服务可能一段时间内都有问题,如果立即发起重试,可能会加剧问题,反而不利于后端服务的恢复。如果隔一段时间待后端节点恢复后,再次发起调用效果会更好。

    FailFast

    快速失败。就是服务消费者调用一次失败后,不再重试。实际在业务执行时,一般非核心业务的调用,会采用快速失败策略,调用失败后一般就记录下失败日志就返回了。

    从对服务容错不同策略的描述中,你可以看出它们的使用场景是不同的,一般情况下对于幂等的调用,可以选择 FailOver 或者 FailCache,非幂等的调用可以选择 FailBack 或者 FailFast。

     

    服务治理的手段是从不同角度来确保服务调用的成功率。节点管理是从服务节点健康状态角度来考虑,负载均衡和服务路由是从服务节点访问优先级角度来考虑,而服务容错是从调用的健康状态角度来考虑,可谓是殊途同归。

    在实际的微服务架构实践中,上面这些服务治理手段一般都会在服务框架中默认集成了,比如阿里开源的服务框架 Dubbo、微博开源的服务框架 Motan 等,不需要业务代码去实现。如果想自己实现服务治理的手段,可以参考这些开源服务框架的实现。

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,097
精华内容 48,038
关键字:

服务治理

友情链接: HTML5植物大战僵尸.zip