Spring Cloud系列教程的所有博客均在下方的目录链接中,方便大家查找和阅读。建议按照顺序学习,对于项目搭建有疑问的可以着重看目录里的第二篇博客。
Spring cloud学习专栏目录
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
下图就是Eureka官方的架构图,大致描述了Eureka集群的工作过程。
Application Service: 也就是服务提供者(相当于我之前文章中的用户微服务)
Application Client: 也就是服务消费者(相当于我之前文章中的车票微服务)
Make Remote Call: 可以简单理解为调用RESTful的接口
Eureka Server: 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client: 是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
<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>
右键 eureka-parent --> new priject -->选择Maven Module
在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);
}
}
在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
右键EurekaServerApplication --> run as --> Spring Boot App
———————————————————————————————————
启动好之后,访问http://localhost:8761/,进入如下页面Eureka就正常启动了
找到之前编写的用户微服务和车票微服务的父工程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>
# 配置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
# 配置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服务、用户微服务、车票微服务。
访问:http://localhost:8761,可以看到我们的两个微服务,用户微服务和车票微服务都已经出现在了Eureka服务注册中心了。
问题回顾:之前我们在TicketService中的 url是写死的,而我们现在有了Eureka,就可以去Eureka中查询服务地址了。
这样其实就是整合了Ribbon,restTemplate就具备了负载均衡的能力。这里没有单独去添加ribbon的依赖是因为 eureka的依赖中就包含了ribbon,所以可以直接使用。关于更多ribbon的讲解我会有另一篇博客,这里就直接使用了。
访问车票微服务中的接口地址 http://localhost:8082/getTicketInfo/1,可以看到成功查询出了用户信息,说明硬编码问题得到了解决
我们打开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>
# 配置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
编写 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();
}
}
访问http://localhost:8761,可以看到已经弹出了登录框
如果出现如下图所示的这种就说明不是以http basic而是form表单的形式
输入之前配置的用户名和密码进行登录即可
# 配置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
# 配置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
这里我遇到了服务无法注册的情况,返回的状态码是401。对比很多的解决方法我的配置应该是没有问题的。我也尝试了许多网上的方法都没有成功,如果哪位大神发现问题所在,欢迎评论区留言告诉我,十分感谢。