Spring Cloud简介
Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
什么是微服务架构?
微服务架构是一种设计风格,就是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过RESTful API进行通信协作。每个服务都能独立部署、扩展、维护,所以这些微服务可以使用各种不同的语言编写。
与单体系统的区别
由于所有的业务逻辑都在一个应用中,随着不断的扩展系统的功能,系统会变得越来越大,非常臃肿。往往修改了一个小小的功能,为了部署上线都会影响其他功能的运行。在发现问题时,也无法快速准确定义是哪里出现的问题。为了解决单体系统难以维护的问题,微服务架构因此诞生,将系统中不同的功能模块拆分成多个不同的服务,这些服务都能够独立部署和扩展。这样上线个小功能时就可以只发这个微服务而不影响其他微服务。也可以快速判断是哪个微服务出了问题。当一个服务挂了之后其他的还可以正常运行。
服务治理
由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netfix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
Spring Cloud Eureka
Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。
创建服务注册中心
创建一个Spring Boot工程,命名为com.david.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.david.eureka</groupId> <artifactId>eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.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> <!--引入eureka-server --> <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>Edgware.SR2</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>
通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。
@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.yml中配置以下信息:
spring: application: name: david-eureka-server server: port: 8761 eureka: instance: hostname: 127.0.0.1 client: register-with-eureka: false fetch-registry: false
通过设置registerWithEureka:false 和fetchRegistry:false 来设置自己是一个server
启动工程,访问http://localhost:8761
No instances available 没有服务被发现,因为没有注册服务,所以这里还没有服务。
创建服务提供方
再创建一个Spring Boot应用,命名为com.david.client,并向服务注册中心注册自己。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.david</groupId> <artifactId>client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.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.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR2</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>
新建testController
package com.david.client.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @Value("${server.port}") String port; @GetMapping("/test") public String test() { return "test;port:" + port; } }
通过@EnableEurekaClient说明自己是一个eurekaclient
@EnableEurekaClient @SpringBootApplication public class ClientApplication { public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); } }
还需要在配置文件中说明自己的服务注册中心的地址,application.yml中配置如下:
spring: application: name: david-eureka-client server: port: 8762 eureka: client: service-url: #指定服务中心地址 defaultZone: http://localhost:8761/eureka/
spring.application.name 指明该服务名称,以后的服务之间互相调用就是根据这个name。
启动该工程,再次访问 http://localhost:8761/ 可以看到我们定义的服务被成功注册了。
http://192.168.20.114:8762/test
当然我们也可以直接访问david-eureka-client服务提供的test借口,只需要访问:http://localhost:8762/test
eureka项目结构:
eureka-client项目结构: