SpringCloud 常用配置
负载均衡分类
集中式负载均衡,客户端和服务端使用独立的负载均衡措施(硬件的F5,软件的Nginx)
进程内负载均衡,将负载均衡逻辑集成在客户端组件中,客户端从注册中心获取可用服务,然后再从服务地址中选择合适的服务端发起请求(Ribbon)
搭建集群版Eureka Server
Eureka Server注册中心集群中的每个节点都是平等的,每个节点可以作为一个服务,服务节点之间通过发送心跳进行投票。
依赖单机版的eurekaServer的项目修改其中的内容即可。
- 新建文件application-eurekaserver1.properties、application-eurekaserver2.properties
spring.application.name=eureka-server
server.port=8761
# 定义Eureka Server实例在注册中心中的命名。建议使用配置文件的后缀定义。
eureka.instance.hostname=eurekaserver1
# 配置集群中其他Eureka Server节点的信息。如果需要配置多个节点,使用逗号','分割多个节点信息。
# 节点的信息格式为: http://地址:端口/eureka/ 。 地址可以使用IP、域名、主机名定义。
# 使用HTTP Basic语法,提供安全认证中需要使用的用户名和密码。
# 语法是: http://用户名:密码@地址:端口/eureka/
eureka.client.serviceUrl.defaultZone=http://eurekaserver2:8761/eureka/
# application-eurekaserver2.properties
spring.application.name=eureka-server
server.port=8761
# 定义Eureka Server实例在注册中心中的命名。建议使用配置文件的后缀定义。
eureka.instance.hostname=eurekaserver1
# 配置集群中其他Eureka Server节点的信息。如果需要配置多个节点,使用逗号','分割多个节点信息。
# 节点的信息格式为: http://地址:端口/eureka/ 。 地址可以使用IP、域名、主机名定义。
# 使用HTTP Basic语法,提供安全认证中需要使用的用户名和密码。
# 语法是: http://用户名:密码@地址:端口/eureka/
eureka.client.serviceUrl.defaultZone=http://eurekaserver2:8761/eureka/
修改 host 文件
192.168.186.115 eurekaserver1
192.168.186.116 eurekaserver2
打包程序分别注册到两个eurekaserver
在上传jar包同级目录新建文件,vi eurekaserver.sh,修改对应的参数
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
JAR_NAME="项目jar包名称"
JAR_PATH=$CUR_SHELL_DIR/$JAR_NAME
#JAVA_MEM_OPTS=" -server -Xms1024m -Xmx1024m -XX:PermSize=128m"
JAVA_MEM_OPTS=""
SPRING_PROFILES_ACTIV="-Dspring.profiles.active=配置文件变量名称"
#SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%..log
echo_help()
{
echo -e "syntax: sh $CUR_SHELL_NAME start|stop"
}
if [ -z $1 ];then
echo_help
exit 1
fi
if [ ! -d "$LOG_DIR" ];then
mkdir "$LOG_DIR"
fi
if [ ! -f "$LOG_PATH" ];then
touch "$LOG_DIR"
fi
if [ "$1" == "start" ];then
# check server
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -n "$PIDS" ]; then
echo -e "ERROR: The $JAR_NAME already started and the PID is ${PIDS}."
exit 1
fi
echo "Starting the $JAR_NAME..."
# start
nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH >> $LOG_PATH 2>&1 &
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}' | wc -l`
if [ $COUNT -gt 0 ]; then
break
fi
done
PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk '{print $2}'`
echo "${JAR_NAME} Started and the PID is ${PIDS}."
echo "You can check the log file in ${LOG_PATH} for details."
elif [ "$1" == "stop" ];then
PIDS=`ps --no-heading -C java -f --width 1000 | grep $JAR_NAME | awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR:The $JAR_NAME does not started!"
exit 1
fi
echo -e "Stopping the $JAR_NAME..."
for PID in $PIDS; do
kill $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps --no-heading -p $PID`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
echo -e "${JAR_NAME} Stopped and the PID is ${PIDS}."
else
echo_help
exit 1
fi
修改可执行权限
chmod 755 eurekaserver.sh
#启动Eureka Server - ./eurekaserver.sh start
#关闭Eureka Server - ./eurekaserver.sh stop
springcloudの核心组件Eureka、Ribbon、Feign、Hystrix、Zuul
各个组件角色扮演:
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
原文链接
搭建单机版Eureka Server
- 使用spring官网生成模板项目,https://start.spring.io/,spring cloud版本Edgware.SR4,spring boot版本1.5.16
- 修改项目的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eurekaServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaServer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.16.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring cloud 默认配置启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- spring cloud Eureka Server 启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 修改全局配置文件 application.properties
# eclipse安装Properties Editor,可以添加中文注释,在Eclipse的 【Help】-> 【 Install New Software.. 】 打开安装插件的向导输入地址,
# http://propedit.sourceforge.jp/eclipse/updates/ 稍等片刻,选择Properties Editor安装后重启即可使用。
# 设置spring应用命名,可以自定义,非必要
spring.application.name=eureka-server
# 设置Eureka Server WEB控制台端口,自定义
server.port=8761
#是否将自己注册到Eureka-Server中,默认的为true
eureka.client.registerWithEureka=false
#是否从Eureka-Server中获取服务注册信息,默认为true
eureka.client.fetchRegistry=false
- 启动类增加@EnableEurekaServer 注解来开启Eureka Server服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 访问Eureka Server WEB控制台
http://localhost:8761/
启动类增加@EnableEurekaServer注解后,提示EnableEurekaServer cannot be resolved to a type,查找网上问题无法解决,遂删除掉maven库中的boot和cloud文件夹,重新更新库问题解决,原因jar包问题