场景描述
- 两个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
此时,就实现了微服务的高可用和负载均衡