什么是 Eureka 注册中心
服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来 存储服务信息,譬如提供者 url 串、路由信息等。服务注册中心是 SOA 架构中最基础的设 施之一。
Eureka 注册中心三种角色
EurekaServer
通过 Register、Get、Renew 等接口提供服务的注册和发现。
ApplicationService(ServiceProvider)
服务提供方 把自身的服务实例注册到 Eureka Server 中
ApplicationClient(ServiceConsumer)
服务调用方 通过 EurekaServer 获取服务列表,消费服务。
搭建一个Eureka 集群
EurekaServer端
创建项目
可以通过spring.io官网提供的模板快速创建一个springboot项目,也可自己创建一个maven项目
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.yhm</groupId>
<artifactId>springcloud-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springcloud-eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version> <relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEn coding>
<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>Dalston.SR5</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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<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>
修改启动类
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
application.properties 全局配置文件
spring.application.name=eureka-server
server.port=8761
#是否将自己注册到 Eureka-Server 中,默认的为 true
eureka.client.registerWithEureka=false
#是否冲 Eureka-Server 中获取服务注册信息,默认为 true
eureka.client.fetchRegistry=false
#设置 eureka 实例名称,与配置文件的变量为主 假如.properties 文件的名字叫做#application-eureka1.properties 则eureka.instance.hostname=eureka2
eureka.instance.hostname=eureka2
#设置服务注册中心地址,指向另一个注册中心 如果有多个则指向多个
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/
#有几个服务,则需要几个properties 文件
Eureka 集群部署
部署环境:需要安装 jdk1.8,正确配置环境变量。 注意:需要关闭 linux 的防火墙,或者是开放 8761 端口
将项目打包
Maven install
上传linux
在/usr/local/创建一个 eureka 的目录
将项目的 jar 包拷贝到/usr/local/eureka
编写一个启动脚本文件
#!/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=配置文件变量名称就是application-eurker.properties 配置文件的后缀" #SPRING_PROFILES_ACTIV=""
LOG_DIR=$CUR_SHELL_DIR/logs
LOG_PATH=$LOG_DIR/${JAR_NAME%..log
echo_help()
{
echo-e"syntax:sh$CUR_SHELL_NAMEstart|stop"
}
if[-z$1];then
echo_help
exit1
fi
if
[!-d"$LOG_DIR"];then
mkdir"$LOG_DIR" fi
if
[!-f"$LOG_PATH"];then
touch"$LOG_DIR"
fi
if["$1"=="start"];then
#checkserver
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}."
exit1
fi
echo"Startingthe$JAR_NAME..."
#start
nohup java $JAVA_MEM_OPTS -jar $SPRING_PROFILES_ACTIV $JAR_PATH>>$LOG_PATH2>&1&
COUNT=0
while[$COUNT-lt1];do
sleep1
COUNT=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME"|awk'{print$2}'|wc-l`
if[$COUNT-gt0];then
break
fi
done PIDS=`ps --no-heading -C java -f --width 1000 | grep "$JAR_NAME" | awk'{print$2}'`
echo"${JAR_NAME}StartedandthePIDis${PIDS}."
echo"Youcancheckthelogfilein${LOG_PATH}fordetails."
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_NAMEdoesnotstarted!"
exit1
fi
echo-e"Stoppingthe$JAR_NAME..."
for PIDin$PIDS;do
kill $PID>/dev/null2>&1
done
COUNT=0
while[$COUNT-lt1];do
sleep1
COUNT=1
forPIDin$PIDS;do PID_EXIST=`ps--no-heading-p$PID` if[-n"$PID_EXIST"];then COUNT=0 break fi done done
echo-e"${JAR_NAME}StoppedandthePIDis${PIDS}."
else
echo_help exit1
fi
设置启动脚本的运行权限
Chmod-R755server.sh
修改 linux 的 host 文件
Vim /etc/hosts
192.168.70.134 eureka1
192.168.70.135 eureka2
启动 eureka 注册中心
./server.shstart 启动
./server.shstop 停止
通过浏览器访问注册中心的管理页面
在高可用的 Eureka 注册中心中构建 provider 服务
与Eureka server端的区别就是pom文件中的
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--server中的是<artifactId>spring-cloud-starter-eureka-server</artifactId> -->
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
启动类
与Eureka server的启动类相比这个是的两个注解是
@EnableEurekaClient
@SpringBootApplication
application.properties 配置文件
spring.application.name=eureka-provider s
erver.port=9090
#设置服务注册中心地址,指向另一个注册中心 ,有几个为服务后边加几个地址
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
修改 windows 的 host 文件
路径:C:\Windows\System32\drivers\etc
192.168.70.134 eureka1
192.168.70.135 eureka2
编写服务接口
controller层
@RestController
public class UserController {
@RequestMapping("/user")
public List<User> getUsers(){
List<User> list = new ArrayList<>();
list.add(new User(1,"zhangsan",20));
list.add(new User(2,"lisi",22));
list.add(new User(3,"wangwu",20));
return list;
}
}
创建 pojo
public class User {
private int userid;
private String username;
private int userage;
//getset方法以及构造方法
}
构建 consumer 服务
pom文件
与provider的一样
application.properties 配置文件
spring.application.name=eureka-consumer server.port=9091
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/
在 Service 中完成服务的调用
@Service
public class UserService {
@Autowired
private LoadBalancerClient loadBalancerClient;//ribbon 负 载均衡器
public List<User> getUsers(){
//选择调用的服务的名称 //ServiceInstance 封装了服务的基本信息,如 IP,端口
ServiceInstance si = this.loadBalancerClient.choose("eureka-provider"); //拼接访问服务的
//这个字符串就是配置问价你这中的名字
URL StringBuffer sb = new StringBuffer(); //http://localhost:9090/user
sb.append("http://").append(si.getHost()).append(":").appen d(si.getPort()).append("/user");
//springMVC RestTemplate RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {};
//ResponseEntity:封装了返回值信息 ResponseEntity<List<User>> response = rt.exchange(sb.toString(),HttpMethod.GET, null, type);
List<User> list =response.getBody(); return list; } }
Controller
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/consumer")
public List<User> getUsers(){ return this.userService.getUsers();
}
}
至此结束。