SpringCloud(六)Config客户端配置与SpringCloud总结

1. Config:客户端连接服务端访问

  • 可以写多个客户端,统一的放到github上,通过一个server去连接

  • 实现配置与编码解耦

  • 在springcloud-config项目中新建文件:config-client.yml,并推送到远端

spring:
  profiles:
    active: dev

---
server:
  port: 8201
# spring配置
spring:
  profiles: dev
  application:
    # 三个服务名称一致
    name: springcloud-provider-dept

# Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      # 服务发布地址
      defaultZone: http://localhost:7001/eureka/

---
server:
  port: 8202
# spring配置
spring:
  profiles: test
  application:
    # 三个服务名称一致
    name: springcloud-provider-dept
    
# Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      # 服务发布地址
      defaultZone: http://localhost:7001/eureka/
  • 新建module:springcloud-config-client-3355
  • 添加pom.xml依赖
<dependencies>
    <!--clientConfig-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <!--Web-->
    <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>
    </dependency>
</dependencies>
  • 创建bootstrap.yml
# 系统级别的配置
spring:
  cloud:
    config:
      # 获取地址
      uri: http://localhost:3344
      # 需要从git上读取的资源名称,不要后缀
      name: config-client
      # 环境
      profile: dev
      # 分支
      label: master
  • 创建application.yml
# 用户级别的配置
spring:
  application:
    name: springcloud-config-client-3355
  • 创建ConfigClientController.java
@RestController
public class ConfigClientController {

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${eureka.client.service-url.defaultZone}")
    private String eurekaServer;

    @Value("${server.port}")
    private String port;

    @RequestMapping("/config")
    public String getConfig() {
        return "applicationName:" + applicationName +
                "eurekaServer:" + eurekaServer +
                "port:" + port;
    }
}
  • 创建主启动类
@SpringBootApplication
public class ConfigClient_3355 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClient_3355.class,args);
    }
}
 eureka:
   client:
     service-url:
       defaultZone: http://localhost:7001/eureka/
 server:
   port: 8201
 spring:
   application:
     name: springcloud-provider-dept
   profiles:
     active: dev
  • 通过数据中可以看到3355module的配置
    • 端口:8201
    • 环境:dev
  • 访问:http://localhost:8201/config
  • 得到客户端配置信息
applicationName:springcloud-provider-depteurekaServer:http://localhost:7001/eureka/port:8201
  • 从而实现,客户端从服务端获取远程配置
  • 在实际开发的过程中,各个模块中不用配置大量的内容,只需固定的配置模板,从根本上实现了编码和配置的解耦,即方便的开发人员,也方便了运维人员的维护。

2. Config:远程配置实战测试

  • 在springcloud-config仓库中添加config-eureka.yml
spring:
  profile:
    active: dev

---
server:
  port: 7001

# spring配置
spring:
  profiles: dev
  application:
    # 三个服务名称一致
    name: springcloud-config-eureka

# Eureka配置
eureka:
  instance:
    # 服务端的实例名称
    hostname: localhost7001
  client:
    # 表示是否向eureka注册中心注册自己
    register-with-eureka: false
    # 如果为false,表示自己为注册中心
    fetch-registry: false
    # 监控页面
    service-url:
      # 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 集群(关联):
      defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/

---
server:
  port: 7001

# spring配置
spring:
  profiles: test
  application:
    # 三个服务名称一致
    name: springcloud-config-eureka

# Eureka配置
eureka:
  instance:
    # 服务端的实例名称
    hostname: localhost7001
  client:
    # 表示是否向eureka注册中心注册自己
    register-with-eureka: false
    # 如果为false,表示自己为注册中心
    fetch-registry: false
    # 监控页面
    service-url:
      # 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 集群(关联):
      defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/

  • 在springcloud-config仓库中添加config-dept.yml
spring:
  profiles:
    active: dev

---
server:
  port: 8001

# mybatis配置
mybatis:
  type-aliases-package: com.example.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

# spring配置
spring:
  profiles: dev
  application:
    # 三个服务名称一致
    name: springcloud-config-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root

# Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      # 服务发布地址
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
  instance:
    # 修改Eureka的默认描述信息
    instance-id: springcloud-provider-dept8001
    # 打开ip信息
    prefer-ip-address: true

# info配置
info:
  app.name: levnli-springcloud
  company.name: www.levnli.cn
  

---
server:
  port: 8001

# mybatis配置
mybatis:
  type-aliases-package: com.example.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml

# spring配置
spring:
  profiles: test
  application:
    # 三个服务名称一致
    name: springcloud-config-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root

# Eureka的配置,服务注册到哪里
eureka:
  client:
    service-url:
      # 服务发布地址
      defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
  instance:
    # 修改Eureka的默认描述信息
    instance-id: springcloud-provider-dept8001
    # 打开ip信息
    prefer-ip-address: true

# info配置
info:
  app.name: levnli-springcloud
  company.name: www.levnli.cn
  • 将仓库代码推送到远端

  • 新建一个module:springcloud-config-eureka-7001

    • springcloud-eureka-7001文件全部复制

    • 在pom.xml添加依赖

      • <!--clientConfig-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        
    • 替换application.yml

      • spring:
          application:
            name: springcloud-config-eureka-7001
        
    • 创建bootstrap.yml

      • spring:
          cloud:
            config:
              name: config-eureka
              label: master
              profile: test
              uri: http://localhost:3344
        
    • 修改主启动类名:EurekaServer_Config_7001

  • 新建一个module:springcloud-config-dept-8001

    • springcloud-provider-dept-8001文件全部复制

    • 在pom.xml添加依赖

      • <!--clientConfig-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        
    • 替换application.yml

      • spring:
          application:
            name: springcloud-config-dept-8001
        
    • 创建bootstrap.yml

      • spring:
          cloud:
            config:
              name: config-dept
              label: master
              profile: test
              uri: http://localhost:3344
        
    • 修改主启动类名:DeptProvider_Config_8001

  • 启动3344端口

  • 启动Config_7001

  • 启动Config_8001

3. SpringCloud总结与展望

  • SpringCloud是依赖SpringBoot的

  • SpringCloud有五大神兽

    • Eureka:注册中心,可配置集群

      • 对比ZooKeepr

        • zookeeper分主节点,当主节点发生网络故障,从节点会选举,但是在选举的过程中有很大的可能发生故障
          • C P原则:一致性、容错
        • Eureka节点之间是平等关系,只有所有注册中心集群全部宕机下线,才会彻底无法使用。
          • A P原则:可用性、容错
      • 添加依赖

        <!--eureka服务依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        
      • 开启服务

        @EnableEurekaServer
        
      • application.yml配置

        server:
          port: 7001
        
        # Eureka配置
        eureka:
          instance:
            # 服务端的实例名称
            hostname: eureka7001.com
          client:
            # 表示是否向eureka注册中心注册自己
            register-with-eureka: false
            # 如果为false,表示自己为注册中心
            fetch-registry: false
            # 监控页面
            service-url:
              # 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
              # 集群(关联):
              defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
        
      • 启动访问:http://localhost:7001

        • 查看注册中心
        • 其他节点信息
        • 已注册服务节点信息
      • 自我保护机制

        • 由于注册中心和服务节点之间是通过心跳检测服务是否还在线
          • 默认30秒探测一下
          • 默认90秒无响应认为死亡
          • 确认服务死亡后,将移除该服务
        • 当服务总数健康值低于15%时,认为服务集群出了故障,为了保证服务能运行,将不再移除服务节点,可能当时数据不是最新,但是服务还能正常使用。只有服务集群健康值恢复才会退出自我保护
        • 默认开启,不建议关闭。
      • 配置移除服务时间

        • eureka注册中心

          # Eureka配置
          eureka:
            server:
              # 关闭自我保护机制
              enable-self-preservation: false
              # 移除失效服务时间: 毫秒
              eviction-interval-timer-in-ms: 2000
          
        • 服务提供者

          # Eureka的配置,服务注册到哪里
          eureka:
            instance:
              # 发送心跳间隔 1s
              lease-renewal-interval-in-seconds: 1
              # 2秒超时,认为死亡
              lease-expiration-duration-in-seconds: 2
          
        • 当该节点下线5秒,服务将会被移除

        • 服务上线后会被重新注册

    • Ribbon:基于客户端的负载均衡,通过RestTemplate,让客户端可以直接调用

      • 添加依赖

        <!--Ribbon-->
        <dependency>
          <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
          <version>1.4.6.RELEASE</version>
        </dependency>
        
    • 使用前需要创建配置对象,通过Bean注入

      • 需要开启客户端负载均衡时,

        /**
        * 配置负载均衡实现RestTemplate
        * 添加@LoadBalanced
        * 基于Ribbon
        */
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
        
    • 调用方式

      (url, 实体:Map, Class<T> responseType)
      
    • 可以处理的请求类型

      • GET
      • HEAD
      • POST
      • PUT
      • PATCH
      • DELETE
      • OPTIONS
    • Feign

      • 是声明式的webservice客户端,让微服务之间调用变得更简单了,只需要创建一个接口,然后添加注解即可。

      • pom.xml依赖

        <!--Feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
        
    • Hystrix

      • 熔断
      • 降级
      • dashboard流监控
    • Zuul

      • 路由
      • 网关