Eureka 是什么?
不熟悉分布式服务的同学可能会对Eureka一脸懵,它是个什么鬼?不必恐慌,Eureka 听起来很神秘,实际他扮演的角色对于java程序员来说可能已经深入人心很久了,了解过分布式服务框架Dubbo的同学应该听过Zookeeper,没错,Zookeeper是一款比较强大的主要用于协调、治理分布式服务的开源产品,今天要说的Eureka 可以说在功能、作用上跟它很像了,你可以先简单的把它理解为一个微服务注册中心,什么是注册中心:简单说就是一个统一管理分布在不同地理位置、不同逻辑分区的节点的对象,可以对接受管理的各站点实施调度、监控、管理等手段。
技术学习方法论
安利一个学习方法:
我们在认识、理解一个全新事物的时候,往往是先接处一堆枯燥乏味的概念、定义和一堆抽象的描述、不管是表象的还是具象的,总之非常抽象,理解比较困难,这时我们可以尝试从全貌上将当前这个新事物与我们已经理解很深刻的老的认知做一些关联,找到其中的相似点,从概念性的描述中找到最最关键的功能、意义,理出一条脉络,从这个点出发,通过实践、实战将这个最主要的点吃透,然后将它的功能、意义、要解决的问题对号入座到实际场景中来深刻认识这个新事物带来的意义,然后再将对它的认知拓展到该事物的各分支细节,当认知到达这个阶段后往往可以针对这个新事物的部分细节贡献自己的建设性研究成果了。
继续我们的主题:
言归正传:搭建Eureka
承前所述,我们要认识Eureka,就要先抓住他的关键点:服务注册,那我们就通过实战来体验一下服务注册;
搭建基础工程:
环境说明:Java1.8,win10,eclipse MARs,maven3.6
WEB架构:Spring Cloud
1.搭建一个简单的java maven工程 ,让它看起来就长得像Eureka服务
我们起个名字spring-cloud-eureka.server
工程创建好之后,结构如下图:
2.配置springboot基础特性
我们的入门工程架构选用springboot, 因此很自然我们在pom.xml中添加springboot的<parent>坐标:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath />
</parent>
然后是工程属性配置:约定源码编译字符集、java版本等
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
加入springCloud依赖包的全局版本管理插件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
加入spring boot 启动器依赖jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
3.添加Eureka相关特性
<!-- 添加eureka的server端依赖坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
因为springboot集成了内置tomcat,所以springboot应用无需外部容器即可以jar包方式启动应用,在maven中,提供了适应这种启动方式的发布包编译插件:spring-boot-maven-plugin。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
然后是创建启动类:
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
还有关键的一步:
配置全局配置文件application.properties
spring.application.name=eureka-server
server.port=8761
#是否将自己注册到Eureka-Server 中,默认的为true
eureka.client.registerWithEureka=false
#是否从eureka拉取服务列表,默认为true
eureka.client.fetchRegistry=false
好了,到了这一步基本完成一个Eureka服务端搭建了,其实搭建完服务端在整个入门级注册中心而言已经完成了80%的工作,接下来就是复制出多个Eureka服务端应用出来,互相注册形成集群;然后搭建多个Eureka客户端来测试服务注册效果;
集群配置:
4.创建Eureka客户端应用:
Eureka客户端应用与服务端大同小异,主要区别体现在启动类注解、全局参数配置上,如下代码所示:
EurekaApplication.java
@EnableEurekaClient
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
application.properties
spring.application.name=eureka-provider
server.port=9091
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://user:123456@group01:8761/eureka/,http://user:123456@group02:8761/eureka/
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
当然,Eureka客户端的应用也可以衍生出消费者、生产者角色出来验证注册到注册中心的服务是否可以正常可调度。
服务提供者核心代码:
@RestController
public class UserController {
@RequestMapping("/userList")
public List<User> getUsers(){
List<User> list = new ArrayList<>();
list.add(new User(1,"杨过",20));
list.add(new User(2,"小龙女",22));
list.add(new User(3,"郭靖",20));
return list;
}
}
服务消费者核心代码:
@Service
public class UserService {
@Autowired
private LoadBalancerClient loadBalancerClient;// ribbon 服务调度、负载均衡
public List<User> getUsers(){
/*
*ServiceInstance 封装了服务的基本信息,如IP,端口
*
*/
//要调用的服务的名称
ServiceInstance si = this.loadBalancerClient.choose("eureka-provider");
//拼接待访问服务的URL
StringBuffer sb = new StringBuffer();
sb.append("http://").append(si.getHost()).append(":").append(si.getPort()).append("/userList");
//springMVC RestTemplate
RestTemplate rt = new RestTemplate();
ParameterizedTypeReference<List<User>> type = new ParameterizedTypeReference<List<User>>() {};
//ResponseEntity:封装了返回值信息
ResponseEntity<List<User>> response =
rt.exchange(sb.toString(),HttpMethod.GET, null, type);
List<User> list =response.getBody();
return list;
}
}
测试入口Controller:
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/consumer")
public List<User> getUsers() {
return this.userService.getUsers();
}
}
以上就是关键代码,感兴趣的小伙伴欢迎与我交流学习。
邮箱:zhbx_lang@sina.com