Eureka独立部署笔记
文章目录
一、单实例Eureka Server
部署目标:
IP\信息 | 操作系统 | 架构 | 规格 |
---|---|---|---|
192.168.189.41 | Centos7.9 | x86 | 2c4g |
1.1 依赖环境准备
1.1.1 JDK 8
(1)上传安装包
JDK安装包已经上传到:https://cloud.189.cn/t/UBB7NnUN3eeu (访问码:th44)
将安装包上传到目标部署服务器/root/目录下,并执行命令:
cd /root/
tar -zxvf jdk-8u341-linux-x64.tar.gz
rm -rf jdk-8u341-linux-x64.tar.gz
mv jdk1.8.0_341 jdk
mv jdk /usr/local/
(2)配置环境变量
配置环境变量:
vi /etc/profile
# 追加如下内容:
export PATH=/usr/local/jdk/bin:$PATH
export CLASSPATH=/usr/local/jdk/lib:$CLASSPATH
# 使环境变量对当前会话生效
source /etc/profile
(3)验证
java
结果如下:
安装完成。
1.1.2 Tomcat
(1)版本选择
Tomcat版本选择可以参考官方给出的表格:
我们jdk选择的是1.8,因此Tomcat就选择9或者10版本。这里选择的是Tomcat9。
(2)上传安装包
Tomcat安装包已经上传到:https://cloud.189.cn/t/6FjiqiiYfuIr (访问码:urj4)
将安装包上传到目标部署服务器/root/目录下,并执行命令:
cd /root/
tar -zxvf apache-tomcat-9.0.82.tar.gz
mv apache-tomcat-9.0.82 tomcat
mv tomcat /usr/local/tomcat
rm -rf apache-tomcat-9.0.82.tar.gz
(3)配置环境变量
vi /etc/profile
# 追加如下内容:
export PATH=/usr/local/tomcat/bin:$PATH
# 使环境变量对当前会话生效
source /etc/profile
(4)验证
在任意目录下执行命令:
startup.sh
在确保防火墙是关闭的条件下,使用浏览器访问http://ip:8080,效果如下:
Tomcat安装完成!
1.2 下载源码与编译
可以使用已经编译好的:https://mvnrepository.com/artifact/com.netflix.eureka/eureka-server
这里如果使用的是Tomcat9,那么Euraka的版本不能是2.x,会有不兼容的问题。
(1)下载源码
源码下载地址:https://cloud.189.cn/t/qqu26jQRbMvi (访问码:tan2)
(或者直接下载已经编译好的:https://cloud.189.cn/t/bamIRnrINzyq (访问码:mn9w))
(2)编译
在本地机器编译:
cd eureka/
gradlew clean build
编译完成后,在下面的目录中找到编译成果:
目录 | 说明 |
---|---|
./eureka-server/build/libs/eureka-server-XXX.war | Tomcat中运行的war包 |
./eureka-server/build/libs/eureka-server-XXX-SNAPSHOT-javadoc.jar | Javadoc |
./eureka-client/build/libs/eureka-client-XXX.jar | 客户端jar包 |
./eureka-client/build/libs/eureka-client-XXX-SNAPSHOT-javadoc.jar | Javadoc |
1.3 上传并启动
将war包重命名为eureka.war,并上传到Tomcat的webapps目录下:
访问http://ip:8080/eureka/,查看结果:
至此,Eureka单机版安装成功!
二、注册服务至单实例Eureka Server
2.1 pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
2.2 配置文件
server.port=8082
spring.application.name=eureka02
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8080/eureka/eureka
配置文件说明:
- server.port:客户端服务启动端口,与Eureka Server的端口无关
- spring.application.name:服务名,在微服务系统中就是微服务名,也是注册到Eureka Server后的名字,在微服务调用的时候,就是用这个名字进行调用的
- eureka.client.register-with-eureka:是否向注册中心注册自己
- eureka.client.fetch-registry:是否要获取已经注册了的服务
- eureka.client.service-url.defaultZone:Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
2.3 启动类
@EnableEurekaClient
@SpringBootApplication
public class EurekaTest02 {
public static void main(String[] args) {
SpringApplication.run(EurekaTest02.class, args);
}
}
2.4 查看注册结果
三、高可用集群部署
部署目标:
IP\信息 | 操作系统 | 架构 | 规格 |
---|---|---|---|
192.168.189.41 | Centos7.9 | x86 | 2c4g |
192.168.189.42 | Centos7.9 | x86 | 2c4g |
192.168.189.43 | Centos7.9 | x86 | 2c4g |
3.1 统一配置
按照单实例的部署步骤,将192.168.189.42与192.168.189.43同样部署好Eureka。
3.2 配置本地域名
对三台机器都执行:
vi /etc/hosts
# 添加如下内容,三台主机的配置相同:
192.168.189.41 www.eureka41.com
192.168.189.42 www.eureka42.com
192.168.189.43 www.eureka43.com
3.3 修改主机名
vi /etc/hostname
# 修改为各自主机的域名:
www.eureka41.com
备注:这里配置主机名,可以类比在嵌入式部署时候的eureka.instance.hostname
修改完毕后重启主机:
reboot
3.3 配置集群
3.3.1 eureka-client.properties
修改/usr/local/tomcat/webapps/eureka/WEB-INF/classes/eureka-client.properties文件,将“eureka.serviceUrl.default=http://localhost:8080/eureka/v2/”替换为:
eureka.serviceUrl.default=http://www.eureka41.com:8080/eureka/v2/,http://www.eureka42.com:8080/eureka/v2/,http://www.eureka43.com:8080/eureka/v2/
eureka.serviceUrl.default=http://192.168.189.41:8080/eureka/v2/,http://192.168.189.42:8080/eureka/v2/,http://192.168.189.43:8080/eureka/v2/
eureka-client.properties部分参数说明:
- eureka.port:Eureka Server的端口,与客户端无关,可以类比在嵌入式部署时候的server.port
- eureka.name:如果要搭建集群,那么三个节点的name值必须一致,Eureka会根据这个值判断是否是同一个服务,如果是的话,才会有replica的概念,可以类比在嵌入式部署时候的spring.application.name
- eureka.serviceUrl.default:配置这个参数,就相当于Server充当了客户端,将自己的信息也注册到了Server中。可以类比在嵌入式部署时候的eureka.client.service-url.defaultZone
- eureka.eurekaServer.context:指定 Eureka 服务器的上下文路径(Context Path)
3.3.2 eureka-server.properties
关闭eureka server的自我保存模式,修改/usr/local/tomcat/webapps/eureka/WEB-INF/classes/eureka-server.properties文件,追加如下内容:
eureka.enableSelfPreservation=false
3.4 重启集群
在三台机器上都执行如下命令:
shutdown.sh
start.sh
3.5 查看集群搭建成果
四、配置系统服务
独立部署的Eureka是基于Tomcat的,因此只需要把Tomcat注册到系统服务即可。
4.1 编写系统服务
vi /usr/lib/systemd/system/tomcat.service
# 内容如下:
[Unit]
Description=tomcat
[Service]
Environment="JAVA_HOME=/usr/local/jdk"
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/stutdown.sh
Restart=always
[Install]
WantedBy=multi-user.target
4.2 配置开机自启
systemctl daemon-reload
systemctl enable tomcat
五、负载均衡
部署目标:
IP\信息 | 操作系统 | 架构 | 规格 |
---|---|---|---|
192.168.189.50 | Centos7.9 | x86 | 2c4g |
其实使用Nginx做负载均衡和使用Keepalived的浮动VIP都是可以的,具体看业务需求。
5.1 安装Nginx
参考:
尚硅谷笔记
5.2 配置Nginx
vi /usr/local/nginx/conf/nginx.conf
# 修改成如下内容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream httpds {
server 192.168.189.41:8080;
server 192.168.189.42:8080;
server 192.168.189.43:8080;
}
server {
listen 8081;
server_name eureka_server;
location /eureka {
proxy_pass http://httpds/eureka;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Scheme $scheme;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
5.3 查看效果
六、注册服务至集群Eureka Server
6.1 pom文件
与单实例版一致:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
6.2 配置文件
server.port=8081
spring.application.name=eureka01
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8081/eureka/v2
6.3 启动类
@EnableEurekaClient
@SpringBootApplication
public class EurekaTest01 {
public static void main(String[] args) {
SpringApplication.run(EurekaTest01.class, args);
}
}
6.4 查看注册结果
七、服务调用
7.1 消费者
7.1.1 pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
7.1.2 配置文件
server.port=8082
spring.application.name=eureka-separate-client-consumer
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://192.168.189.41:8080/eureka/v2,http://192.168.189.42:8080/eureka/v2,http://192.168.189.43:8080/eureka/v2
7.1.3 接口类
@RestController
@RequestMapping("/eureka")
public class EurekaConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/callGetAll")
public String getAll() {
return restTemplate.getForEntity("http://eureka-separate-client-provider/eureka/clients", String.class).toString();
}
}
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
7.1.4 启动类
@EnableEurekaClient
@SpringBootApplication
public class EurekaSeparateClientConsumer {
public static void main(String[] args) {
SpringApplication.run(EurekaSeparateClientConsumer.class, args);
}
}
7.2 生产者
7.2.1 pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
7.2.2 配置文件
server.port=8081
spring.application.name=eureka-separate-client-provider
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://192.168.189.41:8080/eureka/v2,http://192.168.189.42:8080/eureka/v2,http://192.168.189.43:8080/eureka/v2
7.2.3 接口类
@RestController
@RequestMapping("/eureka")
public class EurekaProducerController {
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/clients")
public String getAll() {
// 获取所有微服务名
List<String> services = discoveryClient.getServices();
for (String service : services) {
System.out.println(service);
}
// 获取某个微服务下面所有的实例
List<ServiceInstance> instances = discoveryClient.getInstances("EUREKA01");
for (ServiceInstance instance : instances) {
System.out.println(instance.getServiceId() + ":" + instance.getHost() + ":" + instance.getPort() + ":" + instance.getUri());
}
return discoveryClient.toString();
}
}
7.2.4 启动类
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaSeparateClientProvider {
public static void main(String[] args) {
SpringApplication.run(EurekaSeparateClientProvider.class, args);
}
}