Spring Cloud学习系列第一章:Eureka之服务注册与发现
2017-08-10 18:05
441 查看
一、Spring Cloud简介
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及CloudFoundry等托管平台。
二、服务注册发现
微服务架构中,服务随着业务的增长也会越来越多,如果还使用ip方式调用服务,那简直就是一个无底洞,所以服务的注册在微服务中是一个重要的原则和可扩展能力之一。今天我学习的Spring Cloud支持种服务注册与发现的实现,比如Eureka、Consul、Zookeeper等,但是整合最好的还是Eureka,所以首先进行Eureka的学习。服务注册发现的基本流程是用一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是提供服务的组件名称、地址、数量等,每个组件拥有一个监听设备,当本组件内的某个服务的状态变化时报告至中心化的组件进行状态的更新。服务的调用方在请求某项服务时首先到中心化组件获取可提供该项服务的组件信息(IP、端口等),通过默认或自定义的策略选择该服务的某一提供者进行访问,实现服务的调用。
三、创建Eureka Server项目
Spring Cloud中的项目都是以Spring Boot为基础的,所以大家最好先去熟悉一下Spring Boot框架,当然,Spring Boot框架是很容易入门的,不得不对Scb4c
pring项目团队五体投体啊。
我的学习项目使用的是maven,所以首先创建一个简单的maven项目,修改pom,引入Spring Cloud和Eureka依赖,我的pom.xml内容如下。
<?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>com.nan</groupId> <artifactId>eurekaserver</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eurekaserver</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> <spring-cloud.version>Dalston.SR2</spring-cloud.version> </properties> <dependencies> <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>${spring-cloud.version}</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>
很简单,其实就是一个Spring Boot项目,只不过整合了Spring Cloud和Eureka而已。
由于大部分功能,Spring Cloud Eureka项目已经帮我们实现了,所以我们只需写个项目启动入口代码就好啦。
package com.nan.eurekaserver; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaserverApplication { public static void main(String[] args) { SpringApplication.run(EurekaserverApplication.class, args); } }接下来是比较重要的配置,Spring Boot项目我习惯用YAML配置,所以我的配置文件内容是。
spring: profiles: active: node01 --- spring: profiles: node01 server: port: 8081 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/[/code]为什么会有多环境呢?没错,这是Eureka server高可用的配置方式,不过目前我们暂时只启动一个server节点,后面会讲到高可用的配置。eureka.instance.hostname是server域名,用于eureka客户端或其他eureka
server节点,也是我们访问eureka web ui的域名,register-with-eureka是指注册服务到eureka,fetch-register是指拉取eureka注册的服务,由于我们部署的是单机eureka server,所以这2个都false就好了,server-url.defaultZone是默认的url中心地址,用的就是我们之前配置的hostname和port,再加上eureka这个path。
然后浏览器输入 http://localhost:8081/,就会看到如下界面。
可以看到,没有服务实例注册到上面。四、编写服务注册到Eureka中
Eureka server既然准备好了,现在我们就编写一个servie注册到eureka中。此项目的依赖与Eureka server项目一致,如下。<?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>com.nan</groupId> <artifactId>service-hello</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>service-hello</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> <spring-cloud.version>Dalston.SR2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</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>${spring-cloud.version}</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>
项目启动入口文件是有区别的,如下。package com.nan.servicehello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class ServiceHelloApplication { public static void main(String[] args) { SpringApplication.run(ServiceHelloApplication.class, args); } }可以看到服务提供项目使用的是Eureka client。然后实现一个rest接口。package com.nan.servicehello.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Value("${server.port}") private String serverPort; @RequestMapping("/hello") public String hello(@RequestParam String name) { return "Hello " + name + ", this service port is " + serverPort; } }然后是关键的配置文件。spring: profiles: active: hello01 application: name: HelloService --- spring: profiles: hello01 server: port: 9091 eureka: client: service-url: defaultZone: http://localhost:8081/eureka/[/code] 区别很明显,client的service-url就是刚刚Eureka server的地址。然后启动service hello项目,再去访问http://localhost:8081/。
可以看到,service已经注册到Eureka server了。5、Eureka server高可用配置
Eureka既然能作为服务注册中心,当然是可以高可用配置的,其实原理很简单,多启动几个服务端,每个服务端都能注册和发现其他服务端,主要和单机不同的就是yaml配置文件了。--- spring: profiles: node01 server: port: 8081 eureka: instance: hostname: node01 client: service-url: defaultZone: http://node02:8082/eureka/ --- spring: profiles: node02 server: port: 8082 eureka: instance: hostname: node02 client: service-url: defaultZone: http://node01:8081/eureka/[/code]记得电脑host要增加 127.0.0.1 node01 node02。
客户端呢,service-url就是http://node01:8081/eureka/,http://node02:8082/eureka,客户端会将服务注册到第一台server上,当停止第一台server后,服务会注册到第二台上。
以上就是笔者目前所学,还是很初级的内容,如果有什么错误和遗漏,还请见谅并指正,不胜感激。
相关文章推荐
- 干货实操:微服务Spring Cloud 系列(二) Eureka服务发现与服务注册(strand alone)
- SpringCloud | Docker 学习系列 | Kubernetes 学习 将SpringCloud Eureka 服务注册与发现部署到docker中并放入到Kubernetes中管理
- 学习笔记系列之SpringCloud | 第一章 服务注册中心(Eureka)
- SpringCloud之注册与发现服务(Eureka)|第一章-yellowcong
- SpringCloud系列教程(3)-- Eureka服务注册与发现
- Spring cloud 系列之 服务注册与发现 Eureka
- SpringCloud 进阶之Eureka(服务注册和发现)
- SpringCloud 微服务注册与发现 – 为Eureka Server添加用户认证
- 服务发现和注册和Eureka
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
- SpringCloud微服务系列(1): 创建Eureka服务注册中心
- Eureka服务注册与发现
- springcloud实战之2 服务注册与发现(eureka实现)
- Spring cloud Eureka服务注册及发现(三)发现使用服务
- Spring Cloud系列一 之 eureka服务注册中心
- SOA之路 -- 为什么Eureka比ZooKeeper更适合做服务发现与注册服务
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
- 第一篇: 服务的注册与发现(Eureka)
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)