背景
Eureka,SpringCloud第一代产品,虽说目前Nacos已经席卷而来,基本要掀翻Eureka,但是难免老系统用到的注册中心是Eureka,那么正好,我在操作这个老系统的时候,就遇到了一些坑,我想把多个服务通过两台服务器来完成部署,AB服务器各部署一半,释压的同时,腾出内存,当我以自认为无比清晰的思路去弄,以为一下子就能好时,发现事与愿违,足足花了我N小时,最后仍然只是小细节,踩了坑之后各位就看到了这篇文章,我能怎么办,我也很无奈。
场景
还是一句老话,脱离实战场景讲技术都是耍流氓。我们上我的战略部署思路分析图。
首先在A服务器上有如下一个部署形式,过多的服务单独部署在一台服务器上导致A服务器是负债累累、疲惫不堪。
那么在我分析了一次之后,我将其规划成了如下:
1.将A服务器拆掉Sms、User、Pay等模块
2.在B服务器部署Sms、User、Pay等模块,同时部署一台Eureka,使用Eureka集群维持服务的高可用、容灾。
当然,有经验的小伙伴可能会说,如果使用ABC三台服务器部署三台Eureka,再使用五台服务器每台部署一个服务,岂不是可用性更强?针对这个问题,我们就能得知,要针对实际场景分析问题,而不仅仅是高大上、造大炮的理论知识。实际场景就是服务器有限,如何能更好的方式获取稳定性、可用性。让用户体验变得更好!
实战
那么分析完要做什么,思路有了之后,我们开始实战。老规矩,拉取代码了直接看调试。
实战代码地址:https://gitee.com/yiang-hz/blog.git 路径:blog->springcloud->eureka
实战代码分为两个部分,第一个部分即是单独部署的Eureka,第二部分则是集群分开部署,集群分开部署,支持两种场景,同一台机器的伪集群(同一个服务不同端口号启动)与真实场景的集群(多台机器部署Eureka)。
单独启动Eureka
步骤1:创建项目,导入Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
步骤2:启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaAloneApp {
public static void main(String[] args) {
SpringApplication.run(EurekaAloneApp.class, args);
}
}
步骤3:application.yml配置文件
spring:
application:
name: eureka-alone-server
#启动端口,Eureka默认端口为8761
server:
port: 8761
eureka:
client:
#是否注册自身,当独立启动时,无需注册,集群则需要注册
register-with-eureka: false
#是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取
fetch-registry: false
#注册地址,如果是集群通过逗号 , 分割配置
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
#是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
instance:
prefer-ip-address: true
集群配置Eureka
步骤1与步骤2可同上
步骤3:application.yml配置文件
这里改变了集群需要改变的配置,同理配置了真伪集群两种模式的地址方便测试使用
#服务启动名称,eureka集群时名称必须一致
spring:
application:
name: eureka-cluster-server
#启动端口,Eureka默认端口为8761
server:
port: 8761
eureka:
client:
#是否注册自身,当独立启动时,无需注册,集群则需要注册
register-with-eureka: true
#是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取
fetch-registry: true
#注册地址,如果是集群通过逗号 , 分割配置
service-url:
#伪集群链接地址,伪集群:同一台机器不同端口部署多个相同的服务
#defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
#真集群配置
defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
instance:
#是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
prefer-ip-address: true
#心跳时间 发送心跳包校验时间 单位为秒 默认为30秒
lease-renewal-interval-in-seconds: 30
#剔除时间 心跳丢失后服务端剔除服务时间 单位为秒 默认为90秒
lease-expiration-duration-in-seconds: 90
步骤4:创建客户端服务Member
Maven:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
配置文件:
server:
port: 8689
spring:
application:
name: member-server
eureka:
client:
#是否注册自身,客户端需要为true
register-with-eureka: true
#是否获取eureka注册的其它服务信息,客户端需要为true
fetch-registry: true
#注册地址,如果是集群通过逗号 , 分割配置
service-url:
#伪集群链接地址
#defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
#真集群配置
defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
#是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
instance:
prefer-ip-address: true
启动类:
@SpringBootApplication
public class MemberApp {
public static void main(String[] args) {
SpringApplication.run(MemberApp.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试controller:
@RestController
public class MemberController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getMember/{name}")
public Object getMember(@PathVariable("name") String name) {
return "member:" + name;
}
@GetMapping("/getMemberOrder/{id}")
public Object getMemberOrder(@PathVariable("id") String id) {
//请求示例:http://localhost:8689/getMemberOrder/1 返回:member -> order response:order:1
String orderResult = restTemplate.getForObject(
"http://order-server/getOrder/" + id, String.class
);
return "member -> order response:" + orderResult;
}
}
步骤5:创建客户端服务Order
Maven:同Member
配置文件:
server:
port: 8688
spring:
application:
name: order-server
eureka:
client:
#是否注册自身,客户端需要为true
register-with-eureka: true
#是否获取eureka注册的其它服务信息,客户端需要为true
fetch-registry: true
#注册地址,如果是集群通过逗号 , 分割配置
service-url:
#伪集群链接地址
#defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/
#真集群配置
defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
#是否注册真实IP,默认为false,单机运行所有服务可不打开,如果服务之间需要区分多台部署则需要打开
instance:
prefer-ip-address: true
启动类:
@SpringBootApplication
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
测试Controller:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getOrder/{id}")
public Object getOrder(@PathVariable("id") String id) {
return "order:" + id;
}
@GetMapping("/getMember/{name}")
public Object getMember(@PathVariable("name") String name) {
//请求示例:http://localhost:8688/getMember/lip 返回:order -> member response:member:lip
String memberResult = restTemplate.getForObject(
"http://member-server/getMember/" + name, String.class
);
return "order -> member response:" + memberResult;
}
}
调试
代码编写完成之后我们开始调试进行分析
单独启动
单独启动Eureka时,需注意无需注册其本身,以及也无需获取服务信息,因为本身就有。故以下配置为false
#是否注册自身,当独立启动时,无需注册,集群则需要注册 eureka.client.register-with-eureka: false #是否获取eureka注册的其它服务信息,当独立启动时,无需获取,集群则需要获取 eureka.client.fetch-registry: false
集群启动
集群则与单机启动相反,以上配置都需要改为true。且配置地址是有多少台集群,则一一配置上去。
#注册地址,如果是集群通过逗号 , 分割配置 service-url: #伪集群链接地址 #defaultZone: http://127.0.0.1:8761/eureka/, http://127.0.0.1:8762/eureka/ #真集群配置 defaultZone: http://192.168.0.62:8761/eureka/, http://192.168.0.114:8761/eureka/
注意:伪集群是为了方便测试,可以通过IDEA的并行示例启动,通过不同的端口即可一台机器也能测试集群环境。真集群是有两台在同一局域网下的机器可以进行操作的方式。
PS:支持并行运行的方式在文章最末尾。
真集群部署方式
条件:两台局域网内的服务器,A启动Eureka与Order,B启动Eureka与Member。
启动后如图:
A服务器访问:http://localhost:8688/getMember/lip 可以调用到B服务器的Member服务。
B服务器访问:http://localhost:8689/getMemberOrder/1 可以调用到A服务器的Order服务。
AB服务器亦可通过对方IP与端口拼接路径来进行请求。如:http://192.168.0.114:8689/getMemberOrder/1
至此,部署完成。
伪集群部署方式
同一台机器启动所有服务。两台Eureka,并行一个8761,并行一个8762。然后启动member服务与Order服务。调用同真集群部署方式。直接在该服务器进行操作即可
启动后如图:
IDEA支持并行运行
步骤1:点击修改参数
步骤2:选择对应的启动项,打开并行运行
总结
以上即是Eureka的单独部署与集群模式实现,实现起来并不是太复杂,但是脱离案例只讲理论或者只学理论,实际使用到还是会有很多坑,要知道 做到比知道难三倍!