一、SpringCloud简介
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
二、构建SpirngCloud当中的Eureka模块
我们在上一篇文章当中讲解了如何在一个SpringBoot应用当中构建多模块应用,这边接上一篇的代码继续进行。假如想这样构建,首先需要去看一下上一篇《SpringBoot多模块项目的创建和配置》。
我们可以看到,我们在其中构建了三个模块,分别为Mall_EurekaCenter、Mall_ManageService和Mall_WechatService模块。
现在,我们要实现的任务是把Mall_EurekaCenter当作微服务的服务注册中心,把其他的两个服务分别向注册中心进行注册。
第一步:配置Mall_EurekaCenter模块(服务注册中心)
首先我们在父工程的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smartisan</groupId>
<artifactId>RediaMallCloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--父模块打包类型必须为pom-->
<packaging>pom</packaging>
<!--在父pom文件当中添加模块的名称,子模块pom中<name>标签当中的值-->
<modules>
<module>Mall_EurekaCenter</module>
<module>Mall_ManagerService</module>
<module>Mall_WechatService</module>
</modules>
<name>RediaMallCloud</name>
<description>Demo project for Spring Boot</description>
<!-- parent指明继承关系,给出被继承的父项目的具体信息-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.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>
<!--与《SpringBoot多模块项目的创建和配置》当中唯一区别点当中的版本管理信息-->
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<!-- 在properties中统一控制依赖包的版本,更清晰-->
<dubbo.version>2.5.3</dubbo.version>
<zkclient.version>0.10</zkclient.version>
</properties>
<!--需要使用SpringCloud组件,首先要在pom文件当中加入下面的这个依赖,这个是与《SpringBoot多模块项目的创建和配置》当中的唯一区别点-->
<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>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然后在Mall_EurekaCenter模块当中的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smartisan</groupId>
<artifactId>malleurekacenter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Mall_EurekaCenter</name>
<description>Demo project for Spring Boot</description>
<!-- 把原有的parent的信息注释掉,继承我们的父工程-->
<parent>
<!--<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>--> <!-- lookup parent from repository -->
<groupId>com.smartisan</groupId>
<artifactId>RediaMallCloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在MallEurekaCenterApplication类上面加上@EnableEurekaServer注解,声明这是一个EurekaServer。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class MallEurekaCenterApplication {
public static void main(String[] args) {
SpringApplication.run(MallEurekaCenterApplication.class, args);
}
}
然后在Mall_EurekaCenter模块当中编写application.yml文件的信息:
#注册中心应用名称
spring:
application:
name: eureka-server
#eureka.server.enableSelfPreservation:是否向注册中心注册自己
#通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server.
eureka:
server:
enableSelfPreservation: false
instance:
hostname: localhost
# prefer-ip-address: true
# preferIpAddress: true
# ip-address: 172.193.225.185
# instance-id: ${spring.cloud.client.ipAddress}:${server.port}
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
这个时候我们启动Mall_EurekaCenter这个工程,打开浏览器,输入:http://localhost:8761/,界面如下,发现还没有服务实例出现(因为我们还没有向注册中心注册服务)。
第二步:编写服务提供者(这里编写Mall_ManagerService模块,Mall_WechatService模块相同)并向注册中心进行注册。
首先编写服务提供者的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.smartisan</groupId>
<artifactId>mallmanagerservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Mall_ManagerService</name>
<description>Demo project for Spring Boot</description>
<!-- 把原有的parent的信息注释掉,继承我们的父工程-->
<parent>
<!--<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>--> <!-- lookup parent from repository -->
<groupId>com.smartisan</groupId>
<artifactId>RediaMallCloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</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-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在主类上面增加@EnableEurekaClient注解,声明自己是一个服务提供者
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class MallManagerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MallManagerServiceApplication.class, args);
}
}
编写服务提供者的application.yml文件
#服务提供者的运行端口
server:
port: 8011
#服务提供者的应用名称,http://localhost:8761/页面当中会显示出来
spring:
application:
name: mall-managerservice
#用户配置开发(dev),测试(test),生产(prod)的配置文件,避免频繁改动
profiles:
active: dev
#打包之前注释掉
eureka:
client:
serviceUrl:
defaultZone: http://admin:password@localhost:8761/eureka/
instance:
prefer-ip-address: true
按照上面的步骤,编写Mall_WechatService模块,这样我们编写好了两个服务提供者,运行之后,我们在Mall_EurekaCenter的运行日志当中看到如下信息:
打开浏览器,输入:http://localhost:8761/,界面如下,发现两个服务实例出现
经过以上步骤,我们就声明了两个微服务并且向注册中心进行了注册。
整个工程的结构如下: