Eureka的搭建、测试,以及和Zookeeper的区别
主要功能
在微服务中作为一个注册中心使用,和ZooKeeper是类似的
搭建过程分为两个部分,一个是服务端,一个是客户端(主要是各种Provider)
单台服务端的配置
1.POM文件中需要加入eureka的jar包,项目上右键–Edit Starters–添加Eureka Server
2.yml配置文件中加入
eureka:
server:
enable-self-preservation: false
instance:
hostname: eureka1
#如果只有一台eureka,就可以把自动拉取和注册关闭掉
client:
register-with-eureka: false
fetch-registry: false
3.启动类中加入@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class Sp05EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(Sp05EurekaApplication.class, args);
}
}
客户端的配置
1.POM文件中加入eureka的客户端jar包,可以用Spring Boot Starters,添加Eureka Discovery Client
2.yml配置文件中加入:
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka
3.启动类加入注解:@EnableDiscoveryClient(可选,新版不用加这个注解)
@EnableDiscoveryClient
@SpringBootApplication
public class Sp03UserserviceApplication {
public static void main(String[] args) {
SpringApplication.run(Sp03UserserviceApplication.class, args);
}
}
单台服务器调试
HOSTS文件中加入
127.0.0.1 eureka
然后访问eureka:2001即可访问可视化界面,查看所有已经注册在表中的Provider
集群配置
eureka服务端
yml配置文件
hostname需要不同,自动拉取和注册需要开启
需要创建一个profile配置文件:application-eureka1.yml 和 application-eureka2.yml
在每个配置文件中,只配置:hostname,register-with-eureka,fetch-registry
另外需要新加入 service-url
eureka:
instance:
hostname: eureka1
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka2:2002/eureka/
eureka:
instance:
hostname: eureka2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1:2001/eureka/
Profile配置项目会覆盖主配置文件(相同的会覆盖掉)
在启动参数中加入参数:
设置激活的配置文件
–spring.prifiles.active=eureka1
设置端口号
–server.port=2001
集群测试
打开eureka1:2001和eureka2:2002,在表格中有DS Replicas,显示的是集群中其他的服务器(副本服务器)
Demo
主要通过HttpClient方式测试跨域,由于比较繁琐,我这里用RestTemplate
由于是demo,就不写配置类了,直接放在启动类里面
@SpringBootApplication
public class Sp06RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Controller:
@RestController
@Slf4j
public class RibbonController {
@Autowired
private RestTemplate rt;
@GetMapping("/item-service/{orderId}")
public JsonResult<List<Item>> getItems(@PathVariable String orderId) {
//调用后台商品服务
//url:http://localhost:8001/111222
//{1}是占位符,用orderId填充
JsonResult<List<Item>> r = rt.getForObject("http://localhost:8001/{1}", JsonResult.class, orderId);
return r;
}
@PostMapping("/item-service/decreaseNumber")
public JsonResult<?> decreaseNumber(@RequestBody List<Item> items){
return rt.postForObject("http://localhost:8001/decreaseNumber", items, JsonResult.class);
}
}
其他
Provider需要同时向所有服务器注册,以防某台突然宕机,服务器之间无法拉取到列表
Eureka注册名称的设置
注册时,有可能自动选择主机名进行注册,而不使用ip地址. 主机名在局域网内有可能不会被正确的解析,最好使用ip地址进行注册,而不注册主机名
选择正确的网卡:
修改bootstrap.yml
spring:
cloud:
inetutils:
ignored-interfaces: # 忽略的网卡
- VM.*
preferred-networks: # 要是用的网卡的网段
- 192.168.0
配置中心的配置文件:
eureka:
instance:
prefer-ip-address: true # 使用ip进行注册
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port} # 界面列表中显示的格式也显示ip
Eureka和ZooKeeper的区别
Eureka强调可用性,集群是对等结构
可用性指的是15分钟内,超过85%的Provider心跳异常,Eureka会进入保护模式,网络稳定后,会自动退出保护模式
对等结构中,每一台服务器都是一个peer,某一台服务器宕机互不影响
但是没有Zookeeper的一致性,列表的更新可能会有不及时的情况(拉取列表有时间间隔)
Zookeeper强调一致性,集群是主从接口
没有可用性,主机宕机后,从服务器需要确认主服务器宕机后,再进行选举,这个过程大约是1分钟左右,在这段时间内,服务是中断不可访问的
如果有多台主服务器,这个过程也可以忽略,一台宕机后,另外的主服务器也会照常提供服务,等待宕机主服务器选举完成后,即可提供正常服务
但是这个搭建成本较高,需要服务器数量较多