SpringCloud学习心得之Eureka注册中心的基本使用
SpringCloud学习心得——Eureka注册中心
定义
SpringCloud Eureka
是 SpringCloud Netflix
微服务套件的一部分,基于 REST 的服务,并且提供了基于 Java 的客户端组件,主要负责实现微服务架构中的服务治理功能。
与Zookeeper区别与联系
- CAP 定理:即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。
- Eureka 是基于 AP 原则构建的,而 ZooKeeper 是基于 CP 原则构建的。
- Zookeeper 有一个 Leader,而且在这个 Leader 无法使用的时候通过 Paxos(ZAB)算法选举出一个新的 Leader。这个 Leader 的任务就是保证写数据的时候只向这个 Leader 写入,Leader 会同步信息到其他节点。通过这个操作就可以保证数据的一致性。
- 去 Eureka 中去拉取服务列表,查看你调用的服务在不在其中,在的话就拿到服务地址、端口等信息,然后调用。
搭建Eureka中心
创建maven项目
添加启动类
<!-- Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!-- Spring Cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
添加配置文件
spring:
application:
name: myEureka-Server
server:
port: 8761
eureka:
client:
# 因为自己是主机,所以不向自己注册
register-with-eureka: false
# 自己就是注册中心,所以不用去检索服务
fetch-registry: false
运行,并访问,http://localhost:8761
创建服务提供者
创建项目注册到Eureka
新建maven项目,引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<depenpency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
<!-- Spring Cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建启动类,注意,此处在启动类上的注解是@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
添加测试接口
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/hello")
public String sayHello(){
return "hello";
}
}
增加配置文件
server:
port: 8081
spring:
application:
name: myEureka-Service
eureka:
client:
#这次要注册到eureka上
register-with-eureka: true
serviceUrl:
defaulZone: "http://localhost:8761/eureka/"
instance:
#采用ip注册的方式
prefer-ip-address: true
#id的格式
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
启动成功,去eureka看一下,发现了8762的服务
创建消费者
创建maven项目,eureka-consumer,添加相同依赖与启动类,但要更改配置文件
spring.application.name=eureka-client-article-service
server.port=8082
使用RestTemplate获取Rest服务端调用接口
@Configuration
public class BeanConfiguration {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
创建接口
@RestController
public class ArticleController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/article /callHello")
public String callHello() {
return restTemplate.getForObject("http://localhost:8081/user/hello", String.class);
}
}
调用可以看到成功
我们的目的是通过服务调用,而不要关心端口
改造 RestTemplate
的配置,添加一个 @LoadBalanced
注解,这个注解会自动构造LoadBalancerClient
接口的实现类并注册到 Spring
容器中
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
接下来就是改造调用代码,我们不再直接写固定地址,而是写成服务的名称,这个名称就是我们注册到 Eureka 中的名称,是属性文件中的 spring.application.name
@GetMapping("/callHello")
public String callHello() {
return restTemplate.getForObject("http://myEureka-Service/user/hello", String.class);
}
调用成功,舒服了