什么是服务注册中心
服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串、路由信息等。服务注册中心是 SOA 架构中最基础的设施之一。
服务注册中心的作用
1,服务的注册
2,服务的发现
常见的注册中心有哪些
1,Dubbo 的注册中心 Zookeeper
2,Sringcloud 的注册中心 Eureka
服务注册中心解决了什么问题
- 服务管理
- 服务的依赖关系管理
什么是 Eureka 注册中心
Eureka 是 Netflix 开发的服务发现组件,本身是一个基于 REST 的服务。Spring Cloud将它集成在其子项目 spring-cloud-netflix 中,以实现 Spring Cloud 的服务注册于发现,同时还提供了负载均衡、故障转移等能力。
Eureka 注册中心三种角色
1.Eureka Server
通过 Register、Get、Renew 等接口提供服务的注册和发现。
2.Application Service (Service Provider)
服务提供方,把自身的服务实例注册到 Eureka Server 中。
3.Application Client (Service Consumer)
服务调用方,通过 Eureka Server 获取服务列表,消费服务。
Eureka 单机服务端配置
添加启动器:Eureka Server启动类中添加@EnableEurekaServer注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application文件配置
#当前服务名称
spring.application.name=MyEureka
#服务端口
server.port=8761
#是否将服务本身自己注册到eureka
eureka.client.register-with-eureka=false
#是否从eureka服务中获取获取注册信息
eureka.client.fetch-registry=false
启动启动类,访问本机IP+服务端口,看到如下页面,表示服务已经启动成功
Eureka 服务器集群的搭建
启动器和启动类跟单机版一样
application配置文件需要更改
集群服务器1的配置
spring.application.name=MyEureka
server.port=8761
#设置eureka实例名称
eureka.instance.hostname=eureka1
#eureka集群中其他服务器的连接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/
集群服务器2的配置
spring.application.name=MyEureka
server.port=8761
#设置eureka实例名称
eureka.instance.hostname=eureka2
#eureka集群中其他服务器的连接地址
eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/
本次集群是通过多台Linux虚拟机进行架设
将项目打包为jar文件,在Linux中部署,部署方法,通过java -jar xxx.jar 运行jar文件即可,如需要指定配置文件,
通过--spring.profiles.active={profile} 指定配置文件后缀即可,
如果想后台运行,可以通过脚本文件运行,脚本文件如下:
#!/bin/bash
cd `dirname $0`
CUR_SHELL_DIR=`pwd`
CUR_SHELL_NAME=`basename ${BASH_SOURCE}`
JAR_NAME="项目名称(jar包的全名含.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 脚本文件名
然后通过 脚本文件名 start 启动服务,脚本文件名 stop 停止服务
测试Eureka集群注册中心
创建provider项目
项目创建:
application配置文件
#配置程序名称,通过Eureka注册时,显示的是此名称
#配置应用名称,通过Eureka注册时,显示的是此名称
spring.application.name=MyEureka.provider
#配置应用端口
server.port=9090
#配置eureka集群的连接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/,http://eureka1:8761/eureka/
实体类
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
controller
@RestController
public class UserController {
@RequestMapping("user")
public List getUsers(){
List list = new ArrayList();
list.add(new User(1,"张三",18));
list.add(new User(2,"李四",24));
list.add(new User(3,"王五",25));
return list;
}
}
启动类
类上使用@EnableEurekaClient注解,表示是Eureka客户端,进行Eureka注册
@EnableEurekaClient
@SpringBootApplication
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}
创建consumer项目
创建项目:
application配置文件
#配置应用名称,通过Eureka注册时,显示的是此名称
spring.application.name=MyEureka.consumers
#配置应用端口
server.port=8080
#eureka集群的连接地址
eureka.client.serviceUrl.defaultZone=http://eureka2:8761/eureka/,http://eureka1:8761/eureka/
实体类:
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
service
@Service
public class UserService {
@Autowired
private LoadBalancerClient loadBalancerClient;//Spring的内置对象ribbon 负载均衡器
public List getUsers() {
//ServiceInstance 封装了服务的基本信息,如 IP,端口
ServiceInstance si = loadBalancerClient.choose("MyEureka.provider");//选择调用的服务的名称
//拼接访问服务的 URL
StringBuilder sb = new StringBuilder();
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/user");
//springMVC RestTemplate
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference> parameterizedTypeReference = new ParameterizedTypeReference>() {};
//ResponseEntity:封装了返回值信息
ResponseEntity> exchange = rt.exchange(sb.toString(), HttpMethod.GET, null, parameterizedTypeReference);
List list = exchange.getBody();
return list;
}
}
controller
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("getuser")
public List getUsers(){
List users = userService.getUsers();
return users;
}
}
测试
运行consumer和provider启动类。
然后访问集群中任意的web页面,可以看到刚刚编写的consumer和provider注册成功
如图,已经得到provider注册到Eureka注册中心中的数据