上一篇,我们用一个不是很生动的例子,讲述了服务注册中心和服务提供者以及服务消费者三者之间的联系,我们知道了,服务注册发现中心不仅提供服务的注册,而且,还会告诉消费者,当前哪些服务实例是可用的,对管理员也就是我们维护服务的人来说,可以知道,哪些hostname主机上的服务是正常的,当然,那些没有在服务中心出现的服务,我们也可以定位到故障点,比如,服务所在的服务器是不是停电了?或者是断网了?亦或者是被频繁的消费而崩掉了?
本篇,我们不讲理论,来实战演练,不搞太复杂,就搞个Hello World!
spring-cloud 微服务 使用spring-boot来构建项目非常easy,因此...........
一、Eureka Server中心的搭建
(1)先看项目目录树
1.boot全局run启动入口 - - Application.java
2.boot全局配置属性文件 - - application.properties
3.boot的pom依赖xml配置文件 - - pom.xml
另外,boot打包方式为war包,可以扔在tomcat的webapps文件夹下,随tomcat启动而自行解压部署
(2)pom.xml
<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.appleyk</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>eureka-server</name>
<description>基于Spring-Boot快速开发模式的服务注册中心</description>
<!-- 继承官网最新父POM【假设当前项目不再继承其他POM】 -->
<!-- http://projects.spring.io/spring-boot/#quick-start -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<!-- 使用Java8,嘗試使用新特新【stream和lambda】 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- spring-cloud集中依赖版本管理,版本见官网 http://projects.spring.io/spring-cloud/ -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合 -->
<!-- 该Starters包含很多你搭建项目, 快速运行所需的依赖, 并提供一致的, 管理的传递依赖集。 -->
<!-- 大多数的web应用都使用spring-boot-starter-web模块进行快速搭建和运行。 -->
<!-- spring-boot-starter-web -->
<!-- 对全栈web开发的支持, 包括Tomcat和 spring-webmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加Eureka Server依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 添加热部署 devtools:监听文件变动 -->
<!-- 当Java文件改动时,Spring-boo会快速重新启动 -->
<!-- 最简单的测试,就是随便找一个文件Ctrl+S一下,就可以看到效果 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- optional=true,依赖不会传递 -->
<!-- 本项目依赖devtools;若依赖本项目的其他项目想要使用devtools,需要重新引入 -->
<optional>true</optional>
</dependency>
</dependencies>
</project>
package com.appleyk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* 启动类继承SpringBootServletInitializer方可正常部署至常规tomcat下,其主要能够起到web.xml的作用
* @author yukun24@126.com
* @blob http://blog.csdn.net/appleyk
* @date 2018年2月2日-下午3:52:50
*/
//@EnableEurekaServer:表明应用为eureka服务,有可以联合多个服务作为集群,对外提供服务注册以及发现功能
@EnableEurekaServer
@SpringBootApplication
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
#SpringApplication将从以下位置加载application.properties文件, 并把它们添加到Spring Environment中:
#1. 当前目录下的一个/config子目录
#2. 当前目录
#3. 一个classpath下的/config包
#4. classpath根路径(root)
#这个列表是按优先级排序的(列表中位置高的将覆盖位置低的) 。
#注:你可以使用YAML('.yml') 文件替代'.properties'
#当前Spring-boot启动时占用的端口号===即服务注册中心的端口号
server.port=8011
#服务注册中心主机名
eureka.instance.hostname=localhost
#禁止eureka服务向自己注册服务
eureka.client.register-with-eureka=false
#服务中心不去获取(fetch)其他服务,本职工作就是维护服务实例,而不是消费服务
eureka.client.fetch-registry=false
#服务中心 取消自我保护机制,剔除已关停的客户端节点(服务)
eureka.server.enable-self-preservation = false
#服务中心访问ur了地址 === 主机名:端口号/eureka
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
如果这里不设置false的话,在eureka client中,如果服务挂掉的话,eureka server中心不会剔除无用的服务实例
1.hello world接口服务Controller:HelloController.java
2.boot全局run启动入口 - - Application.java
3.boot全局配置属性文件 - - application.properties
4.boot的pom依赖xml配置文件 - - pom.xml
<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.appleyk</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>client-client</name>
<description>基于Spring-Boot快速开发模式的Eureka客户端--即是服务提供者又是服务消费者</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 添加Eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
package com.appleyk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//@EnableDiscoveryClient: 客户端启用服务发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
#SpringApplication将从以下位置加载application.properties文件, 并把它们添加到Spring Environment中:
#1. 当前目录下的一个/config子目录
#2. 当前目录
#3. 一个classpath下的/config包
#4. classpath根路径(root)
#这个列表是按优先级排序的(列表中位置高的将覆盖位置低的) 。
#注:你可以使用YAML('.yml') 文件替代'.properties'
#当前Spring-boot启动时占用的端口号===即服务注册提供者的端口号
server.port=8080
#注册的服务名 service-id
spring.application.name=hello-service
#服务中心访问ur了地址 === 主机名:端口号/eureka
eureka.client.service-url.defaultZone=http://localhost:8011/eureka/
package com.appleyk.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController//same as @Controller + @ResponseBody
public class HelloController {
//载入DiscoveryClient实例
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String index() {
/**
* 根据eureka的发现功能,获取中心注册的服务实例列表
*/
List<ServiceInstance> instances = client.getInstances("hello-service");
for (int i = 0; i < instances.size(); i++) {
System.err.println("hello,host:" + instances.get(i).getUri() + ",service_id:" + instances.get(i).getServiceId());
}
return "Hello World";
}
}