Spring Cloud-----Eureka 服务注册中心

什么是服务注册中心

服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串、路由信息等。服务注册中心是 SOA 架构中最基础的设施之一。

服务注册中心的作用

1,服务的注册
2,服务的发现

常见的注册中心有哪些

1,Dubbo 的注册中心 Zookeeper
2,Sringcloud 的注册中心 Eureka

服务注册中心解决了什么问题

  1. 服务管理
  2. 服务的依赖关系管理

什么是 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 服务器集群的搭建

启动器和启动类跟单机版一样

额外的加入logback.xml日志配置文件进行更详尽的记录日志

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项目

项目创建:

provider依赖于web启动器和Eureka Client启动器

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项目

创建项目:

consumer依赖于web启动器和Eureka Client启动器

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注册成功


然后通过访问consumer中的controller进行测试,看看能否获取到provider中提供数据

如图,已经得到provider注册到Eureka注册中心中的数据

你可能感兴趣的:(Spring Cloud-----Eureka 服务注册中心)