完整源码:https://gitee.com/wan-lianglin/springcloud-test
什么是Eureka
Netflix在设计Eureka时,遵循的就是AP原则
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper;
SpringCloud封装了NetFlix公司开发的Eureka模块来实现服务注册和发现(对比Zookeeper)Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心
而系统中的其他微服务。使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,SpringCloud的一些其他模块(比如Zuul)就可以通过EurekaServer来发现系统中的其他微服务,并执行相关的逻辑;
2.使用springboot配置Eureka注册中心
导入依赖:
(1)Spring Cloud Starter Eureka Server依赖
(2)热部署工具(可不用导入)
<!-- eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2.Eureka配置
#端口号
server:
port: 7001
#Eureka配置
eureka:
instance:
hostname: localhost #Eureka服务端的实例名称
client:
register-with-eureka: false #表示是否向eureka注册中心注册自己
fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心
service-url: # 监控页面
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
ctrl+鼠标左键点击defaultZone进入源码可以看到:
我们可以从源码处看到defaultZone的默认url为http://localhost:8761/eureka/,而我配置的是本机7001端口,即url:http://localhost:7001/eureka/
3.配置Eureka服务端的启动类
启动成功后进入http://localhost:7001/可以访问Eureka注册中心默认画面
到这里,一个简单的注册中心配置完成。
将服务提供者注册进注册中心
先介绍一下我的项目结构
本项目有四个模块:
1.springcloud-eureka-7001:eureka注册中心,端口号为7001
2.springcloud-provider-dept-8001:服务提供者,端口号为8001
3.springcloud-consumer-dept-8002:消费者,端口号为8003(注意一下,这个端口号为8003)
4.springcloud-api:一个api,用于提供dept实体类
当然,还有一个总的父类模块,配置了以下依赖,用于子类模块使用
<?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.wll</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springcloud-api</module>
<module>springcloud-provider-dept-8001</module>
<module>springcloud-consumer-dept-8002</module>
<module>springcloud-eureka-7001</module>
</modules>
<!-- 打包方式 pom-->
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.22</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring-cloud 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--德鲁伊数据池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--spirngboot启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--日志测试~-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
1.导包
在服务提供者模块中导入Spring Cloud Starter Eureka依赖
即最后一个依赖
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.wll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-provider-dept-8001</artifactId>
<dependencies>
<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
<groupId>com.wll</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
</project>
2.编写配置文件
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.wll.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
username: root
password: root
#Eureka配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/ #对应注册中心的端口,将此实例注册进注册中心
配置启动类
使用@EnableEurekaClient注解开启Eureka自动注册
先启动7001,接着启动8001
我们可以看到,已成功注册到eureka中,但是,当我们点击Status时,会发现不能成功跳转页面,我们还需要完善监控信息,添加在pom中添加一个依赖
<!-- actuator 完善监控信息 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
接着我们可以在application.yml中进行配置
#info配置
info:
app.name: wll-springcloud
company.name: wll.com
重启服务提供者
点击查看提供者的监控信息
我们可以看到跳转的页面上有我们配置的info信息
3.服务发现
在团队开发中,我们可以通过服务发现来查看实例信息
package com.wll.springcloud.controller;
import com.wll.springcloud.pojo.Dept;
import com.wll.springcloud.service.DeptService;
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.*;
import java.util.List;
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
//获取一些配置信息,得到具体的微服务
@Autowired
private DiscoveryClient client;
@PostMapping("/dept/add")
public boolean addDept(@RequestBody Dept dept){
return deptService.addDept(dept);
}
@GetMapping("/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return deptService.queryById(id);
}
@GetMapping("/dept/list")
public List<Dept> queryAll(){
return deptService.queryAll();
}
/**
* 服务发现
* @return
*/
@GetMapping("/dept/discovery")
public Object discovery(){
//获取微服务列表清单
List<String> services = client.getServices();
System.out.println("discovery=>services:"+services);
//通过微服务id得到一个具体的微服务信息
List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
for (ServiceInstance instance : instances) {
System.out.println(
instance.getHost()+"\t"+
instance.getPort()+"\t"+
instance.getUri()+"\t"+
instance.getServiceId()
);
}
return this.client;
}
}
在controller层中,我们注入了DiscoveryClient接口,接着通过client.getServices()方法获取微服务列表清单,通过client.getInstances(“微服务id”);通过微服务id得到一个具体的微服务信息。
在启动类中
//启动类
@SpringBootApplication
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@EnableDiscoveryClient //使服务发现生效
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class);
}
}
在启动类中使用@EnableDiscoveryClient注解,使服务发现生效
重启服务提供者(springcloud-provider-dept-8001),在网页通过localhost:8001/dept/discovery获得以下数据
idea输出:
4.集群环境配置
首先坐好准备工作:
我们创建3个eureka注册中心,分别为springcloud-eureka-7001,springcloud-eureka-7001=2,springcloud-eureka-7003。
改为:
将7001中的依赖复制到7002和7003中,同时在配置文件中修改7002的端口号为7002,7003的端口号为7003
最后,编写7002和7003的启动类,如上图
启动7002和7003可以看到搭建成功。
接下来,我们正式开始搭集群:
1.修改本机C:\Windows\System32\drivers\etc路径下的hosts文件,做一下映射
可以看到我做了三个域名映射
接着在7001端口的配置文件中配7002、7003端口,7002端口的配置文件中配7001、7003端口,7003端口的配置文件中配7001、7002端口,实现集群。
例如:
7001:
7002:
7003:
最后别忘了修改服务提供者的application.yml,实现集群发布:
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.wll.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
name: springcloud-provider-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8
username: root
password: root
#Eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
#info配置
info:
app.name: wll-springcloud
company.name: wll.comlk
开启3个eureka注册中心,开启服务提供者
我们可以看到所有的注册中心都成功注册了服务提供者,并且3个注册中心互相关联。
所有springcloud入门相关(建议从上到下依次阅读):
(14条消息) Spring Cloud Eureka 入门_万1999的博客-CSDN博客
(6条消息) Spring Cloud Ribbon 入门_万1999的博客-CSDN博客
(14条消息) Spring Cloud Hystrix 入门_万1999的博客-CSDN博客