(一)Spring Cloud 简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
(二)搭建服务注册中心 Eureka
Spring Cloud Eureka是 Spring Cloud Netflix 服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。
1.构建一个 maven 主项目
注:这里 Create from archetype 可以不用勾选,直接构建一个空的 maven 项目。
可以在 maven 主项目里统一管理各个子项目所引用的依赖版本,这一系列项目所用的 Spring Cloud 版本为 Finchley.RC1, Spring Boot 版本为 2.0.1.RELEASE, JDK 为 1.8
pom.xml 文件部分如下
-
<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>Finchley.RC1
</spring-cloud.version>
-
<spring-boot.version>2.0.1.RELEASE
</spring-boot.version>
-
</properties>
-
-
-
<dependencyManagement>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-dependencies
</artifactId>
-
<version>${spring-cloud.version}<span class="hljs-tag"></<span class="hljs-name">version</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">type</span>></span>pom<span class="hljs-tag"></<span class="hljs-name">type</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>import<span class="hljs-tag"></<span class="hljs-name">scope</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-dependencies<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>${spring-boot.version}
</version>
-
<type>pom
</type>
-
<scope>import
</scope>
-
</dependency>
-
</dependencies>
-
</dependencyManagement>
2. 创建一个 module,作为服务注册中心 Eureka Server
注:这里 Create from archetype 仍然不用勾选,直接构建一个空的 maven 项目。
创建完工程后,在 pom.xml 文件中引入依赖
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-server
</artifactId>
-
</dependency>
3. 启动类
只需要在 Spring Boot 工程的启动 EurekaServiceApplication 类上加 @EnableEurekaServer 注解。
-
@SpringBootApplication
-
@EnableEurekaServer
-
public
class EurekaServiceApplication {
-
public static void main(String[] args) {
-
SpringApplication.run(EurekaServiceApplication.class, args);
-
}
-
}
4. Eureka 的配置文件 application.yaml
-
server:
-
port:
8761
-
spring:
-
application:
-
name: eureka-service
-
eureka:
-
instance:
-
hostname: localhost
-
client:
-
#由于该应用为注册中心,设置为false,表明不向注册中心注册自己
-
register-with-
eureka:
false
-
#是否从eureka服务器获取注册信息,这里不需要
-
fetch-
registry:
false
-
service-
url:
-
defaultZone:
http:/
/${eureka.instance.hostname}:${server.port}/eureka
/
-
logging:
-
level:
-
com:
-
netflix:
-
eureka: OFF
-
discovery: OFF
Eureka 是一个高可用的组件(后续会配置),每一个实例注册之后需要向注册中心发送心跳,在默认情况下 erureka server 也是一个eureka client ,必须要指定一个 server,通过 eureka.client.register-with-eureka:false 和 fetch-registry:false 来设置自己是一个eureka server
5. 运行 EurekaServiceApplication 启动服务
在浏览器中输入http://localhost:8761,就可以看到Eureka的管理界面
当前因为还没有服务注册进来,所以是 No instances available
(三)服务注册与发现:注册服务提供者
1. 创建一个 module,作为服务提供者,与创建 Eureka 类似
2. 添加 pom 依赖
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
-
</dependency>
3. 启动类
@SpringBootApplication @EnableEurekaClient @RestController public class SpringCloudServiceApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudServiceApplication.class, args); } }
通过注解@EnableEurekaClient 表明自己是一个 EurekaClient。
@EnableEurekaClient 注解是基于 spring-cloud-netflix 依赖,只能 eureka 使用
还可以使用 @EnableDiscoveryClient
@EnableDiscoveryClient 注解是基于 spring-cloud-commons 依赖,并且在classpath中实现
4. 写一个服务接口
@RestController public class PortService { @Value("${server.port}") String port; @RequestMapping("port") public String getPort() { return "Hello World, I'm from port : " + port; } }
5. 配置文件 application.yaml
server: port: 8281 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: spring-demo-service
6. 启动应用
在Eureka的控制台上已经看到应用名,证明服务提供者已经成功注册在Eureka上了