SpringCloud(一)之Eureka
1.eureka是什么?
eureka 其实就是一个javaweb程序,通过map来存放节点信息,然后显示的时候通过map取出数据进行展示。进而达到它成为一个注册中心的目的。
2.eureka和zookeeper的区别
首先明白一个理论CAP定理,C(Consistency)一致性、A(Availability)可用性,P(Partition tolerance)分区容错性,在一个分布式系统中,三者不可兼得。
zookeeper
zookeeper其实就是一个分布式协调服务,它设计的初衷就是做 一个分布式协调服务,为了数据的一致性而存在的。(天然的分布式锁)。保证了数据的高度一致性。
zk和eureka的区别
zk更加支持的是一致性(c),和分区容错性(p),而eureka更加支持的是可用性(a)和分区容错性§。
zk的可用性并没有eureka那么高,其实上一个分布式系统我们更加需要的是注册中心的高可用,只要注册中心活着一切都好说,zk由于他的重启选举的时间较长,所以可用性并没有eureka的好。所以就拿一个注册中心来讲,eureka的性能是要比zk好的。
3.springboot集成eureka
1.首先创建一个聚合工程,用来管理依赖。
pom文件如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.18.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
</dependencies>
2.创建注册中心
pom依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>
<!--
和安全相关的配置,添加后 eureka 就会需要密码访问
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
yml配置:
server:
port: 8900
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
security:
user:
name: admin
password: admin
代码:
@SpringBootApplication
@EnableEurekaServer
public class EurekaAppliaction {
public static void main(String[] args) {
SpringApplication.run(EurekaAppliaction.class);
}
}
需要注意的是这里是一个eureka的注册中心所以需要加EnableEurekaServer注解。
然后启动项目就可以看到一个注册中心的管理界面如下:
可以看到在eureka中注册的服务信息。
3.创建服务提供者
yml配置:
server:
port: 8901
spring:
application:
name: provider-eureka
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin@localhost:8900/eureka
代码:
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class);
}
}
因为是一个客户端所以注解为EnableEurekaClient。启动项目就可以在注册中心中看到自己的注册信息了,可以在上图中查看。
4.创建服务消费者
yml的配置信息和提供者的基本一致,这里就不再累述了。
消费者代码:
package com.zy.eureka.consume;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class EurekaConsumeApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumeApplication.class, args);
}
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
RestTemplate这个对象是spring针对于接口调用的一个类,可以去调用服务提供者的链接。
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private EurekaClient eurekaClient;
@GetMapping("/hello")
public String hello() {
InstanceInfo info = eurekaClient.getNextServerFromEureka("PROVIDER-EUREKA", false);
String url = info.getHomePageUrl();
String result = restTemplate.getForObject(url+"hello/eureka", String.class);
return result;
}
}
EurekaClient是eureka的一个客户端对象,可以通过这个对象获取注册在eureka上的提供者的信息,再过通过
RestTemplate进行调用即可。
当然这样调用如果服务消费者者调用服务提供者的时候还是单一的调用一个主机,没有达到负载均衡的作用,接下来的博客中会介绍springcloud之ribbon来实现消费者调用提供者的负载均衡。