Eureka 是 Netflix 开发的服务发现组件,本身是一个基于 REST 的服务。Spring Cloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 Spring Cloud 的服务注册于发现,同时还提供了负载均衡、故障转移等能力。服务端和客户端之间通过心跳包进行检测。
Eureka 注册中心三种角色
1、EurekaServer,通过 Register、Get、Renew 等接口提供服务的注册和发现。
2、ApplicationService(ServiceProvider),服务提供方,把自身的服务实例注册到 Eureka Server 中。
3、ApplicationClient(ServiceConsumer),服务调用方,通过 EurekaServer 获取服务列表,消费服务。
搭建 EurekaServer
1、创建Maven项目,修改pom.xml文件
<project
2、核心配置文件
application-eureka1.xml
![v2-c4695d916f8dfb51c8003efd840f7329_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-c4695d916f8dfb51c8003efd840f7329_b.png)
application-eureka2.xml
![v2-0c7efc509c09d1fd6738bc737071b08b_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-0c7efc509c09d1fd6738bc737071b08b_b.png)
3、启动类
![v2-13695fa8a186d4212f1b5e303a640524_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-13695fa8a186d4212f1b5e303a640524_b.png)
4、项目打包部署至Linux
部署环境:需要安装 jdk1.8,正确配置环境变量。
192.168.130.147 eureka1
192.168.130.148 eureka2
5、启动脚本文件
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
JAR_NAME="项目名称"
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
6、设置启动脚本的运行权限
chmod-R 755 脚本名.sh
7、修改 Linux 的 host 文件
192.168.130.147 eureka1
192.168.130.148 eureka2
8、启动eureka注册中心
./server.sh start
./server.sh stop
9、通过浏览器访问注册中心的管理页面
![v2-fef6c65ae820e5d6abaa21dd1c2cc979_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-fef6c65ae820e5d6abaa21dd1c2cc979_b.jpg)
而消费者和提供者都从属与客户端,之间如果远程调用需要都注册到 Eureka
提供者
![v2-56b5ebfbada23b939d7394bae79a16ca_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-56b5ebfbada23b939d7394bae79a16ca_b.png)
消费者
![v2-2b4957b30406593348df48f21181d810_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-2b4957b30406593348df48f21181d810_b.png)
![v2-35a9be164231e6c80c61142419e73442_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-35a9be164231e6c80c61142419e73442_b.jpg)
Eureka 优雅停服
1、需要在客户端中添加 actuator.jar。该 jar 在eureka-server 中找的到,可以修改pom.xml文件
![v2-a1790d0009bdf3235a395b5b38ab9d1a_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-a1790d0009bdf3235a395b5b38ab9d1a_b.png)
2、修改配置文件
![v2-9710f3094bb5ddd892b82aa29b906566_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9710f3094bb5ddd892b82aa29b906566_b.png)
3、使用HTTP工具类发送POST请求关闭
public class HttpClientUtil {
public static String doGet(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
String resultString = "";
CloseableHttpResponse response = null;
try {
// 创建uri
URIBuilder builder = new URIBuilder(url);
if (param != null) {
for (String key : param.keySet()) {
builder.addParameter(key, param.get(key));
}
}
URI uri = builder.build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
public static String doGet(String url) {
return doGet(url, null);
}
public static String doPost(String url, Map<String, String> param) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建参数列表
if (param != null) {
List<NameValuePair> paramList = new ArrayList<>();
for (String key : param.keySet()) {
paramList.add(new BasicNameValuePair(key, param.get(key)));
}
// 模拟表单
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList,"utf-8");
httpPost.setEntity(entity);
}
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
public static String doPost(String url) {
return doPost(url, null);
}
public static String doPostJson(String url, String json) {
// 创建Httpclient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(url);
// 创建请求内容
StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
response = httpClient.execute(httpPost);
resultString = EntityUtils.toString(response.getEntity(), "utf-8");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultString;
}
public static void main(String[] args) {
String url ="http://127.0.0.1:9090/shutdown";
//该url必须要使用dopost方式来发送
HttpClientUtil.doPost(url);
}
}
Eureka安全认证
修改 Eureka Server 的pom文件
![v2-e4f706337f1a6c0834f9d5e10c878b9e_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-e4f706337f1a6c0834f9d5e10c878b9e_b.png)
修改 Eureka Server 全局配置文件
![v2-02ce3a5a0b71c37f3910fc68778b150f_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-02ce3a5a0b71c37f3910fc68778b150f_b.jpg)
重新部署到 Linux 中,测试访问
![v2-8f7a95583370cf36af0560206ee695aa_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-8f7a95583370cf36af0560206ee695aa_b.jpg)
在客户端注册的时候,同样需要进行安全认证
![v2-bf1c67baeed9c502f7b9d5bba8cee02a_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=2bafddbf-d52e-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-bf1c67baeed9c502f7b9d5bba8cee02a_b.jpg)