Parent很简单,创建一个空的maven项目,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.zuikc</groupId>
<artifactId>springcloud.parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka01</module>
<module>eureka02</module>
<module>provider01</module>
<module>provider02</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
</project>
注意两个地方:
1:spring-boot-starter-parent要被指定为整个解决方案的parent;
2:4个Modul随着下文项目的创建会被自动创建;
如果说dubbo的注册中心zookeeper,那么在spring cloud中的注册中心就是:eureka,并且使用起来还要更容易上手一些。
现在,就让我们来创建第一个eureka站点。
首先先创建一个maven子模块,并添加公用依赖。
类型选择如下:
创建完毕,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/maven-v4_0_0.xsd">
<parent>
<artifactId>springcloud.parent</artifactId>
<groupId>com.zuikc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>eureka01</name>
<artifactId>eureka01</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</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>
<dependencies>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</project>
代码:
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @ClassName RegisterApplication
* @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”
* @Author 码农星球
**/
@EnableEurekaServer
@SpringBootApplication
public class RegisterApplication {
public static void main(String[] args) {
SpringApplication.run(RegisterApplication.class,args);
}
}
application.yml
server:
port: 9091
eureka:
instance: #定义Eureka实例
hostname: eureka-9091.com #Eureka实例所在的主机名
client:
register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true
fetch-registry: false #表示是否从Eureka Server上获取注册信息,默认为true
service-url:
defaultZone: http://localhost:9091/eureka/
接着run RegisterApplication,如果没有异常报错,再从浏览器访问http://localhost:9091/,看到如下界面,则说明成功。
有了注册中心了,现在,让我们写两个服务提供者站点。
服务提供者,也叫Eureka客户端,它把自己注册到Eureka服务器中,并周期性的发送心跳来更新它的服务租约。
为什么要两个呢?为了体现分布式呀。我们创建两个子模块,它们的类型都是webapp,如下,
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/maven-v4_0_0.xsd">
<parent>
<artifactId>springcloud.parent</artifactId>
<groupId>com.zuikc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>provider01</name>
<artifactId>provider01</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</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.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
然后启动类为:
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @ClassName Provider1Application
* @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”
* @Author 码农星球
**/
@SpringBootApplication
@EnableDiscoveryClient
public class Provider1Application {
public static void main(String[] args) {
SpringApplication.run(Provider1Application.class, args);
}
}
然后controller为:
package com.zuikc;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @ClassName HelloController
* @Description 我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系“码农星球”
* @Author 码农星球
**/
@Configuration
@Controller
public class HelloController {
@RequestMapping("hello")
@ResponseBody
public String hello() {
return "hello zuikc.com!";
}
}
然后application.yml为:
server:
port: 9191
spring:
application:
name: hello-service
eureka:
client:
service-url:
defaultZone: http://localhost:9091/eureka/
注意,第二个服务项目,上面的配置中的port为9192就是了,其它配置和控制器本身的代码都一模一样。
然后,先启动eureka,再分别启动两个服务提供者。结果如下:
以下这张图是springcloud著名的架构图,
在这张图中,我们可以看到,包括EurekaServer(即注册中心)本身,也是不止一个的。这是因为,在实际的应用中,注册中心理应是可以被集群的。这样,当集群中有分片发生故障的时候,Eureka会自动转入自我保护模式。它允许在分片发生故障的时候继续提供服务的发现和注册,当故障分配恢复时,集群中的其他分片会把他们的状态再次同步回来。
既然说到了注册中心的集群,那我们就来继续创建一个eureka服务器吧。
在parent下建立子module。所有过程和创建eureka01一样,并且pom和RegistApplication也一样。
唯一需要改变的就是配置文件。
首先,然我们回到eureka01中,修改application.yml如下:
server:
port: 9091
eureka:
instance: #定义Eureka实例
hostname: eureka-9091.com #Eureka实例所在的主机名
client:
#register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true
#fetch-registry: false #表示是否从Eureka Server上获取注册信息,默认为true
service-url:
defaultZone: http://localhost:9092/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-service
首先,我们将client下两个不允许自己注册的属性注释掉。
同时,将service-url的地址指向到了第二个注册中心的地址。也就是说,两个注册中心要互相引用。
其次,我们加了enable-self-preservation: false,这属性默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存。
最后,我们加了spring这个属性节点,将本身作为服务命名为eureka-service。
Ok,然后再来修改第二个eureka服务器的配置文件,
server:
port: 9092
eureka:
instance: #定义Eureka实例
hostname: eureka-9092.com #Eureka实例所在的主机名
client:
#register-with-eureka: false #表示是否将自己注册到Eureka Server上,默认为true
#fetch-registry: false #表示是否从Eureka Server上获取注册信息,默认为true
service-url:
defaultZone: http://localhost:9091/eureka/
server:
enable-self-preservation: false
spring:
application:
name: eureka-service
整个项目创建完毕,目录结构大概是这样的,
接下来,让我们首先启动eureka01。注意,启动01的时候由于02还没有启动,所以会报连接不到02,但是没有关系,忽略就行,因为02马上就会启动,它会自动续约。
接着启动eureka02,然后再启动两个provider吧。
可以看到,4个服务都已经启动了,
注意,这个时候去9092,也就是eureka02,也能看到这4个服务,
感谢关注“码农星球”。本文版权属于“码农星球”。我们提供咨询和培训服务,关于本文有任何困惑,请关注并联系我们。