spring cloud+docker-compose方式实现微服务高可用、负载均衡

场景描述

  • 两个eureka服务
  • 两个zuul网关服务
  • client服务做集群处理(client-1启动两个、client-2启动三个、client-3启动两个)

eureka配置文件

spring:
  application:
    name: register-center
---
spring:
  profiles: register-center8761
server:
  port: 8761
eureka:
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 3000
    peer-node-read-timeout-ms: 30000
  instance:
    hostname: register-center8761
  client:
    serviceUrl:
      defaultZone: http://register-center8762:8762/eureka/
    register-with-eureka: true
    fetch-registry: true
    registry-fetch-interval-seconds: 5

---
spring:
  profiles: register-center8762
server:
  port: 8762
eureka:
  server:
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 3000
    peer-node-read-timeout-ms: 30000
  instance:
    hostname: register-center8762
  client:
    serviceUrl:
      defaultZone: http://register-center8761:8761/eureka/
    register-with-eureka: true
    fetch-registry: true
    registry-fetch-interval-seconds: 5

eureka的docker-compose文件

version: '2'
services:
  register-center8761:
    image: "register-center:V1"
    container_name: register-center8761
    hostname: register-center8761
    networks:
      - eureka-net
    ports:
      - 8761:8761
    environment:
      - spring.profiles.active=register-center8761
  register-center8762:
    image: "register-center:V1"
    container_name: register-center8762
    hostname: register-center8762
    networks:
      - eureka-net
    ports:
      - 8762:8762
    environment:
      - spring.profiles.active=register-center8762

networks:
  eureka-net:
    driver: bridge

注:如果要在docker容器中映射域名只需在docker-compose中加入以下代码

extra_hosts:
  - "register-center8761:IP地址"
  - "register-center8762:IP地址"

期间遇到一个神坑,记录一下:
如果使用的是阿里云的服务器,需要将端口加入安全组(否则8762端口无法使用,比如无法打开erueka控制台)(zuul的8181同理):
阿里云控制台 --> 云服务器ECS – > 网络与安全 --> 安全组 --> 配置规则

在这里插入图片描述
zuul网关配置文件(基于config)

spring:
  cloud:
    config:
      discovery:
        enabled: true
        serviceId: config-center
      name: gateway-zuul
      profile: test
      fail-fast: true

---
spring:
  profiles: gateway-zuul-1
server:
  port: 8081
  tomcat:
    max-http-post-size: -1
eureka:
  client:
    serviceUrl:
      defaultZone: http://IP地址:8761/eureka/,http://IP地址:8762/eureka/
    registry-fetch-interval-seconds: 5
  instance:
    lease-expiration-duration-in-seconds: 15
    lease-renewal-interval-in-seconds: 5
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

---
spring:
  profiles: gateway-zuul-2
server:
  port: 8181
  tomcat:
    max-http-post-size: -1
eureka:
  client:
    serviceUrl:
      defaultZone: http://IP地址:8761/eureka/,http://IP地址:8762/eureka/
    registry-fetch-interval-seconds: 5
  instance:
    lease-expiration-duration-in-seconds: 15
    lease-renewal-interval-in-seconds: 5
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

gateway-zuul-test.yml(无特殊配置)

spring:
  application:
    name: gateway-zuul
server:
  tomcat:
    max-http-post-size: -1
eureka:
  client:
    serviceUrl:
      defaultZone: http://IP地址:8761/eureka/,http://IP地址:8762/eureka/
    registry-fetch-interval-seconds: 5
  instance:
    lease-expiration-duration-in-seconds: 15
    lease-renewal-interval-in-seconds: 5
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${server.port}
zuul:
  ignored-services: '*'
  sensitiveHeaders:
  routes:
    oauth:
      path: /api-o/**
      serviceId: oauth-center
  host:
    connect-timeout-millis: 10000
    socket-timeout-millis: 60000
  add-proxy-headers: true
  ribbon:
    eager-load:
      enabled: true
ribbon:
  ReadTimeout: 180000
  ConnectTimeout: 180000
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2880000
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      show-details: always

zuul的docker-compose文件

version: '2'
services:
  gateway-zuul-1:
    image: "zuul:V1"
    ports:
     - 8081:8081
    mem_limit: 2500m
    volumes:
      - /logs:/logs
    environment:
      - TZ=Asia/Shanghai
      - spring.profiles.active=gateway-zuul-1
  gateway-zuul-2:
    image: "zuul:V1"
    ports:
      - 8181:8181
    mem_limit: 2500m
    volumes:
      - /logs:/logs
    environment:
      - TZ=Asia/Shanghai
      - spring.profiles.active=gateway-zuul-2

nginx.conf需加入负载均衡相关配置

   upstream adminServer {
        keepalive 50;
        server IP地址:8081 weight=1;
        server IP地址:8181 weight=1;
    }

    server {
        listen      80;
        location / {
          proxy_pass http://adminServer/;
     }

client配置文件中的eureka相关配置

eureka:
  client:
    serviceUrl:
      defaultZone: http://IP地址:8761/eureka/,http://IP地址:8762/eureka/
  instance:
    prefer-ip-address: true

注:client的启动类上需要加入以下代码

	@Bean
    @LoadBalanced //使客户端拥有负载均衡能力(重点)
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    /**
	* 因为加入@LoadBalanced之后,只能通过eureka中的服务名访问
	* 所以对外部远程IP地址发起请求的时候,可以注入commRestTemplate:
	* @Autowired  
    * private RestTemplate commRestTemplate;
	*/
	@Bean    
	public RestTemplate commRestTemplate() { 
       RestTemplate restTemplate = new RestTemplate();     
       restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));  
       return restTemplate;   
 	}

client的docker-compose文件
正常docker-compose的配置,关键在于运行docker-compose的命令

version: '2'
services:
  client-1:
    image: "client-1:V1"
    mem_limit: 2500m
    environment:
      - TZ=Asia/Shanghai
    mem_limit: 2500m
    environment:
      - TZ=Asia/Shanghai
  client-3:
    image: "client-3:V1"
    mem_limit: 2500m
    environment:
      - TZ=Asia/Shanghai

运行命令
docker-compose -f docker-compose文件名.yml scale client-1=2 client-2=3 client-3=2

此时,就实现了微服务的高可用和负载均衡

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值