Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。
微服务架构中,服务随着业务的增长也会越来越多,如果还使用ip方式调用服务,那简直就是一个无底洞,所以服务的注册在微服务中是一个重要的原则和可扩展能力之一。今天我学习的Spring Cloud支持种服务注册与发现的实现,比如Eureka、Consul、Zookeeper等,但是整合最好的还是Eureka,所以首先进行Eureka的学习。
服务注册发现的基本流程是用一个中心化的组件完成对各个服务的整合,即将分散于各处的服务进行汇总,汇总的信息可以是提供服务的组件名称、地址、数量等,每个组件拥有一个监听设备,当本组件内的某个服务的状态变化时报告至中心化的组件进行状态的更新。服务的调用方在请求某项服务时首先到中心化组件获取可提供该项服务的组件信息(IP、端口等),通过默认或自定义的策略选择该服务的某一提供者进行访问,实现服务的调用。
Spring Cloud中的项目都是以Spring Boot为基础的,所以大家最好先去熟悉一下Spring Boot框架,当然,Spring Boot框架是很容易入门的,不得不对Spring项目团队五体投体啊。
我的学习项目使用的是maven,所以首先创建一个简单的maven项目,修改pom,引入Spring Cloud和Eureka依赖,我的pom.xml内容如下。
4.0.0
com.nan
eurekaserver
0.0.1-SNAPSHOT
jar
eurekaserver
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.6.RELEASE
UTF-8
UTF-8
1.8
Dalston.SR2
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
很简单,其实就是一个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/
为什么会有多环境呢?没错,这是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 server既然准备好了,现在我们就编写一个servie注册到eureka中。此项目的依赖与Eureka server项目一致,如下。
4.0.0
com.nan
service-hello
0.0.1-SNAPSHOT
jar
service-hello
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.6.RELEASE
UTF-8
UTF-8
1.8
Dalston.SR2
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
项目启动入口文件是有区别的,如下。
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/
可以看到,service已经注册到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/
记得电脑host要增加 127.0.0.1 node01 node02。
客户端呢,service-url就是http://node01:8081/eureka/,http://node02:8082/eureka,客户端会将服务注册到第一台server上,当停止第一台server后,服务会注册到第二台上。
以上就是笔者目前所学,还是很初级的内容,如果有什么错误和遗漏,还请见谅并指正,不胜感激。