SpringCloud学习笔记之Eureka
一. 写在前面
Spring Cloud及微服务的概念最近被炒得很火。准备把学习了解到的这些东西记录下。主要还是参考网络上的一些前辈写好的博客和资料。目的更多的也只是作为个人的备忘录及记录下学习的历程。开发工具选择了Idea,依赖管理工具用的是maven。Spring Cloud各组件版本我会多可能或多做一些尝试,主要做到依赖版本不冲突就好了。
二. 创建服务注册中心
看标题其实可以知道,我们这一章主要讲的就是服务注册发现。废话不多说,直接看看怎么做。
2.1 创建一个maven项目
先记下要引入的依赖:使用spring-boot-starter-parent作为父项目,引入spring-boot-starter-test作为测试框架。
<?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.zqx</groupId>
<artifactId>eurekaregistry</artifactId>
<version>1.0-SNAPSHOT</version>
<name>springcloud-chapter1</name>
<description>Demo project for SpringCloud</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<modules>
<module>eureka-server</module>
<module>eureka-client</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>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<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>
对于这个pom说明下:
首先,有几个对我来说之前不太熟的maven知识点,记录下怎么查他们的概念和用法的:
dependencyManagement 参考:https://blog.csdn.net/OiteBody/article/details/70882940
parent标签 参考:https://blog.csdn.net/yeguxin/article/details/77109725
引入spring-boot-starter-parent有什么用 参考:https://blog.csdn.net/qq_35981283/article/details/77802771
哪spring-boot-starter-test呢 https://www.cnblogs.com/chenergougou/p/6834336.html
其次,看到这里有两个module。说明后面我们会搞两个子项目。一个作为服务注册中心(eureka-server),一个作为服务提供者(eureka-client)。以后以上pom就作为公共的父pom,
其他的子项目都引入他。
2.2 创建一个子项目
右击工程 =》New =》Module。
按照之前父pom里定义的module填写子项目名:
选择eureka-server作为服务注册发现组件:
做完之后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.zqx</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.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>
<spring-cloud.version>Finchley.SR1</spring-cloud.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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<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>
可以看到,这里从父项目里自动带过来了很多东西。主要就只是自动加了spring-cloud-starter-netflix-eureka-server这个依赖。所以,其实我们可以精简一下。很多从父pom里带过来的东西其实是重复的。精简后的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.zqx</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for eureka-server</description>
<parent>
<groupId>com.zqx</groupId>
<artifactId>eurekaregistry</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
2.3 配置启动一个服务注册中心
这里主要就两步,一是启动类加上@EnableEurekaServer注解
package com.zqx.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
二是创建配置文件application.yml并配置好一些基础的属性。
server:
port: 6666
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eureka-server
一般情况下,一个eureka-server默认也是一个eureka-client。所以,我们设置register-with-eureka=false 让其不向服务注册中心注册自己。fetch-registry=false设置不检索服务。按我理解,一般来说只有服务注册中心这个特殊的服务这样配置,其他服务都默认为true。
2.4 启动服务注册中心
到这里其实,我们就可以启动服务注册中心看下效果了:
发现其实目前为止,我们没有任何服务注册上去。所以,接下来我们要做的就是把eureka-client这个服务注册上去。
三. 创建一个服务提供者并注册到服务注册中心
3.1 再次创建一个子项目
这里其实和前面差不多,也是创建子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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zqx</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-client</name>
<description>Demo project for eureka-client</description>
<parent>
<groupId>com.zqx</groupId>
<artifactId>eurekaregistry</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<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>
</dependencies>
</project>
可以看到其实就多了一个spring-boot-starter-web,这个东西是干啥的呢?参考:https://www.cnblogs.com/sherrykid/p/6419620.html
在我看来,作用其实和SpringMVC差不多。就是换了一种引入方式,比以前更方便了而已。后面会用到一些这里面提供的注解。
3.2 配置启动一个服务提供者
主要有3步,一启动类加上@EnableEurekaClient注解;二启动类直接加个@RestController方法,并实现一个服务方法,这里暂时就不考虑什么分层的问题了,主要还是为了演示;三就还是创建配置application.yml并配置好一些基础属性了。如下,
package com.zqx.eurekaclient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name",defaultValue = "zqx") String name){
return "hi "+name+",i am from port:"+port;
}
}
server:
port: 6667
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:6666/eureka/
spring:
application:
name: eureka-client
3.3 启动服务
此时就已经可以启动这个服务,查看效果了。
可以看到现在的服务列表里面已经有一个服务了,且我们可以直接用浏览器请求访问这个服务提供的方法url,测试下方法的效果: