Spring cloud中Eureka的使用简单示例(Spring cloud学习笔记 4)

杀马特。学长 韩版系。学妹 提交于 2020-01-31 02:40:30

一、Eureka简介

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。

二、Eureka原理

下图就是Eureka官方的架构图,大致描述了Eureka集群的工作过程。
在这里插入图片描述
Application Service: 也就是服务提供者(相当于我之前文章中的用户微服务)
Application Client: 也就是服务消费者(相当于我之前文章中的车票微服务)
Make Remote Call: 可以简单理解为调用RESTful的接口

Eureka包含两个组件:Eureka Server 和 Eureka Client。

Eureka Server: 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client: 是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

  • 在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka
    Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
  • Eureka Server之间将会通过复制的方式完成数据的同步。
  • Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
  • 综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

三、实现Eureka Server

3.1 创建父工程(Eureka-parent)

3.1.1 新建一个Maven Project
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.1.2 pom文件中导入依赖

在这里插入图片描述

<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.springcloud</groupId>
  <artifactId>eureka-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <!-- 导入Spring Cloud的依赖管理 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
    	<!--springboot 整合eureka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2 创建子工程(Eureka-Server)

右键 eureka-parent --> new priject -->选择Maven Module
在这里插入图片描述
在这里插入图片描述

3.3 编写启动类

在eureka-server下的src/main/java 下创建一个package(com.eureka.server),新建一个EurekaServerApplication类
在这里插入图片描述

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);
	 }
}

3.4 配置application.properties

在resources下创建application.properties配置文件,进行配置
eureka.client.register-with-eureka = false: eureka复制模式是对等复制,所以当服务启动时会根据service-url地址去进行注册,而当前是单机模式而非集群,service-url的值为自身的路径,这时就会出现自己注册自己的情况,从而就会出现(com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect)无法连接的错误,因为默认值是true所以当单机环境下,需要设置为false。
register-with-eureka: = false:是否从Eureka中获取注册信息,因为当前为单机模式自己为注册中心,不会在该应用中的检索服务信息所以这里也需要设置为false.

在这里插入图片描述

# 配置api端口号
server.port=8761
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称
spring.application.name=eureka-server

# 设置当前实例的主机名称
eureka.instance.hostname=localhost
# 是否启动注册
eureka.client.register-with-eureka=false
# 是否检索服务
eureka.client.fetch-registry=false
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka

3.5 启动 Eureka-server

右键EurekaServerApplication --> run as --> Spring Boot App
在这里插入图片描述
启动好之后,访问http://localhost:8761/,进入如下页面Eureka就正常启动了
在这里插入图片描述

四、将微服务注册到Eureka

4.1 修改pom文件

找到之前编写的用户微服务和车票微服务的父工程microservice-parent的pom文件加入如下两段依赖,注意这里我们稍微有一点修改version版本改为了2.0.3,是为了和org.springframework.cloud的版本Finchley.SR4相匹配。(这两个微服务的编写请参考我的另一篇博客使用Spring cloud实现微服务最简单的入门demo
修改pom文件后如果项目报错就右键 --> Maven -->update project之后就好了

在这里插入图片描述
在这里插入图片描述

<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>  
  <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
  </parent>
  
  <groupId>com.springcloud</groupId>
  <artifactId>microservice-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <modules>
  	<module>microservice-provide-user</module>
  	<module>microservice-consumer-ticket</module>
  </modules>
  
  <dependencyManagement>
        <dependencies>
            <!-- 导入Spring Cloud的依赖管理 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  <dependencies>
  		<!-- web支持 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--springboot 整合eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  </dependencies>

  <build>
	  <plugins>
		  <!-- 资源文件拷贝插件 -->
		  <plugin>
			  <groupId>org.apache.maven.plugins</groupId>
			  <artifactId>maven-resources-plugin</artifactId>
			  <configuration>
				  <encoding>UTF-8</encoding>
			  </configuration>
			  </plugin>			
          <!-- springboot插件 -->
          <plugin>
			  <groupId>org.springframework.boot</groupId>
			  <artifactId>spring-boot-maven-plugin</artifactId>
		  </plugin>       	
	  </plugins>
  </build>
</project>

4.2 修改application.properties

4.2.1 修改用户微服务的配置文件
在这里插入图片描述

# 配置api端口号
server.port=8081
# tomcat
server.tomcat.uri-encoding=UTF-8

# 服务名称,也就是在eureka
spring.application.name=microservice-provide-user

# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka

4.2.2 修改车票微服务的配置文件
在这里插入图片描述

# 配置api端口号
server.port=8082
# tomcat
server.tomcat.uri-encoding=UTF-8

# 服务名称,也就是在eureka
spring.application.name=microservice-consumer-ticket

# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
eureka.client.service-url.default-zone=http://localhost:8761/eureka

4.3 修改启动类

4.3.1 修改用户微服务的启动类
在这里插入图片描述
4.3.2 修改车票微服务的启动类
在这里插入图片描述

4.4 启动服务进行测试

4.4.1 启动 EurekaServer

4.4.2 启动 UserServer

4.4.3 启动 TicketServer

4.4.4 访问http://localhost:8761
可以看到我们的两个微服务,用户微服务和车票微服务都已经出现在了Eureka服务注册中心了。

五、解决车票微服务中的硬编码问题

问题回顾:之前我们在TicketService中的 url是写死的,而我们现在有了Eureka,就可以去Eureka中查询服务地址了。
在这里插入图片描述

5.1 修改车票微服务启动类,添加负载均衡的注解

这样其实就是整合了Ribbon,restTemplate就具备了负载均衡的能力。这里没有单独去添加ribbon的依赖是因为 eureka的依赖中就包含了ribbon,所以可以直接使用。关于更多ribbon的讲解我会有另一篇博客,这里就直接使用了。

5.2 修改service中的方法实现

5.2.1 将地址和端口用我们之前在用户微服务的application.properties中设置的服务名称替换
在这里插入图片描述
在这里插入图片描述
5.2.2 启动服务进行测试
访问车票微服务中的接口地址 http://localhost:8082/getTicketInfo/1,可以看到成功查询出了用户信息,说明硬编码问题得到了解决
在这里插入图片描述
在这里插入图片描述

六、Eureka添加用户认证

6.1 pom文件中添加依赖

我们打开eureka-parent的pom依赖文件,添加如下图所示的安全认证依赖即可
在这里插入图片描述

<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.springcloud</groupId>
  <artifactId>eureka-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <!-- 导入Spring Cloud的依赖管理 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
    	<!--springboot 整合eureka服务端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--eureka安全认证-->
        <dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <modules>
    	<module>eureka-server</module>
    </modules>
</project>

6.2 修改application.properties配置文件

加入用户名和密码的配置,并且修改服务注册的地址
在这里插入图片描述

# 配置api端口号
server.port=8761
# tomcat
server.tomcat.uri-encoding=UTF-8
# 服务名称
spring.application.name=eureka-server

# 登录的用户名和密码
spring.security.user.name=zzz
spring.security.user.password=123456

# 设置当前实例的主机名称
eureka.instance.hostname=localhost
# 是否启动注册
eureka.client.register-with-eureka=false
# 是否检索服务
eureka.client.fetch-registry=false
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka

6.3 编写Eureka安全认证类

编写 WebSecurityConfig类和Eureka启动类放在同级目录下
在这里插入图片描述

package com.eureka.server;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
    	//2.1版本的security默认加上了 csrf拦截, 所以需要通过重写方法把csrf拦截禁用,否则服务无法注册
        http.csrf().disable();
        //为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
        //高版本的Springcloud废弃了 spring.security.basic.enabled注解,所以需要通过如下方式开启
        //不加上这个的话,就会以form表单的形式进行提交
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}

6.4 启动eureka服务进行测试

访问http://localhost:8761,可以看到已经弹出了登录框
在这里插入图片描述
如果出现如下图所示的这种就说明不是以http basic而是form表单的形式
****
输入之前配置的用户名和密码进行登录即可
在这里插入图片描述
在这里插入图片描述

6.5重新启动微服务进行注册

6.5.1 修改用户微服务的配置文件,修改注册地址
按照eureka配置中的地址进行修改
在这里插入图片描述

# 配置api端口号
server.port=8081
# tomcat
server.tomcat.uri-encoding=UTF-8

# 服务名称,也就是在eureka
spring.application.name=microservice-provide-user

# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka

6.5.2 修改车票微服务的配置文件,修改注册地址
按照eureka配置中的地址进行修改
在这里插入图片描述

# 配置api端口号
server.port=8082
# tomcat
server.tomcat.uri-encoding=UTF-8

# 服务名称,也就是在eureka
spring.application.name=microservice-consumer-ticket

# 是否启动注册,这是一个客户端需要注册
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=true
# 服务注册中心的地址
#eureka.client.service-url.default-zone=http://localhost:8761/eureka
eureka.client.service-url.default-zone=http://zzz:123456@localhost:8761/eureka

6.5.3 启动服务进行测试
这里我遇到了服务无法注册的情况,返回的状态码是401。对比很多的解决方法我的配置应该是没有问题的。我也尝试了许多网上的方法都没有成功,如果哪位大神发现问题所在,欢迎评论区留言告诉我,十分感谢。
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!