1.啥是SpringCloud,和SpringBoot有啥联系
SpringCloud是基于SpringBoot的,他们的联系在于SpringBoot专注于开发单个个体微服务,而SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、为代理、事件总栈、全局锁、决策竞选、分布式会话等等集成服务;
每个SpringBoot项目都可以独立使用和开发,但SpringCloud离不开SpringBoot,属于依赖关系;
2.Spring Cloud 五大组件
服务注册与发现——Netflix Eureka
负载均衡:
- 客户端负载均衡——Netflix Ribbon
- 服务端负载均衡:——Feign(其也是依赖于Ribbon,只是将调用方式RestTemplete 更改成Service 接口)
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
接下来我们根据这五个组件进行对项目的搭建。
3.创建父工程
新建父工程,等下我们会在此工程中创建不同的module,创建完成后对父pom文件进行修改:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<!-- 父工程为pom -->
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<!-- 指定子模块 -->
<modules>
<module>eureka-server</module>
<module>service-hi</module>
</modules>
<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需要与SpringBoot的版本对应,见图1 -->
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 不被子pom文件继承的依赖放在dependencyManagement里-->
<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>
图1 SpringCloud与SpringBoot的版本对应关系
4.创建子module
(1)创建服务注册中心
前面我们创建了一个父工程,接下来在父工程中新建module,名为eureka-server(见父pom中定义的module),eureka-server作为服务注册中心。
右键工程->创建model-> 选择Spring initialir,接下来选择:
创建完成后,由于前面在父pom文件中声明了该项目,所以pom文件继承了父pom文件的依赖,并且引入了spring-cloud-starter-netflix-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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 子pom为jar -->
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<!--指定父pom文件-->
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
然后需要在项目的启动类加上一个注解@EnableEurekaServer:
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
// 启动一个服务注册中心
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
最后新建application.yml,并编写配置:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
# 通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
register-with-eureka: false
fetch-registry: false
service-url:
# 通过eureka.client.defaultZone声明所有module的注册中心地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
由此,我们已经完成了注册中心的创建,后续我们可以通过访问http://localhost:8761查看注册成功的服务。
(2)创建服务提供者
tips:服务提供者会在注册的同时,提供一些元数据,如主机和端口,URL,主页等
按上面创建项目的步骤再创建一个名为service-hi的工程,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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接着在项目的启动类加上一个注解@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
@RestController
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name",defaultValue = "jiege") String name) {
return "hi," + name + ",i am from port:" +port;
}
}
application.yml:
server:
port: 8762
spring:
application:
name: service-hi
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
# defaultZone指定eureka-server的地址
然后启动项目,可以访问http://localhost:8761查看注册的服务。我们打开http://localhost:8762/hi:
我们可以尝试启动多个实例,具体步骤如下:
(1)在IDEA上点击Application右边的下三角,弹出选项后,点击Edit Configuration
(2)打开配置后,选择工程,勾上Allow parallel run。
(3)通过修改application.yml的端口,启动多个实例,多个端口分别启动,我们把端口改为8763,效果如下:
(4)访问http://localhost:8761查看注册的服务,可以看到service-hi工程有两个实例: