咱们在以前的博客中已经介绍过阿里的分布式服务框架dubbo【Linux上安装Zookeeper以及一些注意事项】【一个简单的案例带你入门Dubbo分布式框架】,可是小伙伴们应该也看到了,阿里的dubbo没法单独完成工做,咱们还要借助于Apache上的开源框架zookeeper(不是必须,可是最佳实践莫过于zookeeper),使用zookeeper做为服务注册中心,才能实现一个较好的分布式应用。与dubbo不一样的是,Spring Cloud是一个一站式分布式框架,Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调致使了样板模式, 使用Spring Cloud开发人员能够快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员本身的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。那么今天我但愿经过一个简单的案例带小伙伴们来了解下Spring Cloud。java
OK,那么本文我主要想介绍下在Spring Cloud中使用Eureka搭建一个服务注册中心,而后再向其中注册服务。因为Spring Cloud是在Spring Boot的基础上构建分布式服务的,因此阅读本文须要有一点Spring Boot的知识储备,若是小伙伴们对Spring Boot尚不太熟悉的话,能够先参考下【https://github.com/lenve/JavaEETest】。
OK,那么上面所提到的是阅读本文所须要具有的基础知识,在此基础之上咱们来看看怎么样利用Spring Cloud中的Eureka来搭建服务注册中心。git
首先我要说的是Spring Cloud并非一个东西,和Hadoop相似,Spring Cloud也包含了许多个子项目,咱们今天要看的Eureka只是其中的一个子项目,Eureka的功能有点相似于咱们以前写过的zookeeper,它是一个服务治理组件,包含了服务注册中心、服务注册与发现机制。其余的组件咱们这里先不作介绍,后面的系列文章都会一一说起到。github
OK,废话说了一箩筐,上代码吧。web
建立服务注册中心
建立一个普通的Spring Boot工程
首先咱们须要建立一个普通的Spring Boot工程,命名为eureka-server,普通到什么程度呢?就是一个starter都不须要添加,建立成功以后就只引用了一个父starter。spring
添加Eureka依赖
工程建立成功以后,向pom.xml文件中添加eureka-server的依赖,目前eureka的稳定版本是Dalston.SR3
,添加完依赖以后,pom.xml文件以下所示:apache
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sang</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
那么这里依赖的添加我主要参考了Eureka官网的 http://projects.spring.io/spring-cloud/。浏览器
启动一个服务注册中心
启动一个服务注册中心的方式很简单,就是在Spring Boot的入口类上添加一个@EnableEurekaServer
注解,以下:微信
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
配置服务注册中心
最后咱们再作一点简单的配置就能够了,配置就写在Spring Boot的配置文件application.properties中,写法以下:app
server.port=1111 eureka.instance.hostname=localhost eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
OK,那么关于这几行注释,我说以下几点:框架
1.server.port=1111表示设置该服务注册中心的端口号
2.eureka.instance.hostname=localhost表示设置该服务注册中心的hostname
3.eureka.client.register-with-eureka=false,因为咱们目前建立的应用是一个服务注册中心,而不是普通的应用,默认状况下,这个应用会向注册中心(也是它本身)注册它本身,设置为false表示禁止这种默认行为
4.eureka.client.fetch-registry=false,表示不去检索其余的服务,由于服务注册中心自己的职责就是维护服务实例,它也不须要去检索其余服务
测试
OK,作完这一切以后,咱们就能够启动这一个Spring Boot 服务,服务启动成功以后,在浏览器中输入:http://localhost:1111就可以看到以下页面:
OK,看到上面这个页面以后,表示你的服务注册中心已经搭建好了。
小结
咱们以前专门有一篇博客介绍如何在Linux上安装zookeeper【Linux上安装Zookeeper以及一些注意事项】,可是对于Eureka却不存在这样的问题,由于Eureka中的服务注册中心其实是一个Spring Boot工程,而Spring Boot工程咱们知道能够直接打成一个jar包,而后java -jar命令就能够运行,无论Windows仍是Linux上,运行方式都是一致的。
注册服务提供者
OK,那么如今服务注册中心有了以后,咱们能够考虑向这个服务注册中心注册一个服务提供者了。
建立一个新的Spring Boot工程
仍是建立一个Spring Boot工程,此次建立比以前建立多一个步骤,在建立的时候选中web的starter,咱们来建立一个web工程,在IntelliJ IDEA中建立的时候选中web,以下:
添加Eureka依赖
在建立好的工程中,咱们须要添加Eureka依赖,添加方式以下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.sang</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
建立应用的入口
这是一个web工程,因此咱们添加一个Controller,在该Controller中提供一个访问入口,以下:
@RestController public class HelloController { private final Logger logger = Logger.getLogger(getClass()); @Autowired private DiscoveryClient client; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String index() { List<ServiceInstance> instances = client.getInstances("hello-service"); for (int i = 0; i < instances.size(); i++) { logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId()); } return "Hello World"; } }
这里建立服务以后,在日志中将服务相关的信息打印出来。
激活Eureka中的DiscoveryClient
在Spring Boot的入口函数处,经过添加@EnableDiscoveryClient注解来激活Eureka中的DiscoveryClient实现(由于咱们在HelloController中注入了DiscoveryClient)。
@EnableDiscoveryClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
配置服务名称和注册中心地址
最后的最后,咱们在application.properties文件中配置一下服务名和注册中心地址便可,以下:
spring.application.name=hello-service eureka.client.service-url.defaultZone=http://localhost:1111/eureka
这两行代码的含义很简单,我就很少说了。
测试
作完这一切以后,咱们就能够来测试了,直接运行这个Spring Boot工程,运行成功以后,咱们刷新刚才的http://localhost:1111,就能够看到有一个服务已经注册成功了。以下:
同时,咱们查看这个服务提供者运行日志,也能够看到服务的信息,以下:
小结
OK,如此以后,咱们一个服务注册中心就搭建成功了,同时也有一个服务提供者成功的注册了。可是这样还有一个小问题,那就是咱们这里是一个单节点的服务注册中心,一旦发生了故障整个服务就瘫痪了,因此在实际应用中,咱们须要搭建高可用注册中心,那么关于高可用注册中心如何搭建的问题,咱们将在下篇文章中来介绍。
本文案例地址:https://github.com/lenve/SimpleSpringCloud
更多JavaEE资料请关注公众号:
以上。。
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。