文章目录
eureka简介
EureKa在Spring Cloud全家桶中担任着服务的注册与发现的落地实现。Netflix在设计EureKa时遵循着AP原则,它基于R
EST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,功能类似于Dubbo的注册中心Zookeeper。
Eureka主要分为Server和client两部分,client又分为服务消费者consumer和服务提供者provider。
新建一个SpringCloud项目
首先创建一个maven项目 创建完成后 因为我们的主工程主要是管理子模块 所以src文件用不到可以直接删除
在pom文件中加入一个packaging为pom,因为默认是jar,这里是作为父工程使用
编写总工程的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.herobin.ad</groupId>
<artifactId>herobin-ad</artifactId>
<!--设置主项目的pom打包方式为pom,默认是jar-->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!--声明项目信息-->
<name>ad-spring-cloud</name>
<description>Project For Imooc Ad SpringCloud</description>
<!--主模块中引入springboot的模块,子模块中就不需要引入了-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
</parent>
<!--定义通用属性-->
<properties>
<!--指定springcloud版本-->
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<!--通用的依赖放在父模块中,子模块会自动拥有这些依赖-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</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>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--springcloud的远程仓库地址-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Eureka服务端server
首先我们实现一个服务端server的实现
新建项目
在主工程下新建一个模块module ad-eureka
编写好eureka的pom文件 可以发现主工程的pom里面自动写入了这个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">
<parent>
<artifactId>herobin-ad</artifactId>
<groupId>com.herobin.ad</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目/模块的坐标, groupId从父模块中继承 -->
<artifactId>ad-eureka</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 模块名及描述信息 -->
<name>ad-eureka</name>
<description>Spring Cloud Eureka</description>
<!-- eureka server: 提供服务发现与服务注册 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
spring:
application:
name: ad-eureka
server:
port: 8000
eureka:
instance:
hostname: localhost
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
---
spring:
application:
name: ad-eureka
profiles: server1
server:
port: 8000
eureka:
instance:
hostname: server1 #因为是在本地运行,要去etc/host下进行配置让不同的服务指向一个ip地址
prefer-ip-address: false
client:
service-url:
defaultZone: http://server2:8001/eureka/,http://server3:8002/euraka/
---
spring:
application:
name: ad-eureka
profiles: server2
server:
port: 8001
eureka:
instance:
hostname: server2
prefer-ip-address: false
client:
service-url:
defaultZone: http://server1:8000/eureka/,http://server3:8002/euraka/
---
spring:
application:
name: ad-eureka
profiles: server3
server:
port: 8002
eureka:
instance:
hostname: server3
prefer-ip-address: false
client:
service-url:
defaultZone: http://server1:8000/eureka/,http://server2:8001/euraka/
启动类EurekaApplication
注意这里使用到的注解@EnableEurekaServer
.
package com.herobin.ad;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @author binzhang
* @date 2019-04-25
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
启动程序
执行EurekaApplication的main方法启动程序,输入localhost:8000
多个Eureka互相注册
进入项目目录下运行 mvn clean package -Dmaven.test.skip=true -U
打包程序
进入 ad-eureka 的 target目录下可以看到jar包 运行jar包
java -jar ad-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server1
启动第一个eureka server
会发现报错了
因为没有启动server2和server3
java -jar ad-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server2
java -jar ad-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=server3
这样相互注册就成功了
如果有三台机器就可以在三台机器上分别启动三个服务,实现eureka server的高可用注册。
Eureka客户端client
这里我们编写一个zuul模块来作为eureka的client注册到eureka server中。
zuul是微服务的网关路由。
首先我们要了解微服务架构的两种方式 点对点和API-网关
zuul就是API-网关方式的实现。
新建项目
新建模块ad-gateway 做网关模块
pom文件
依赖主要引入了eureka-client
和zuul
.
<?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>herobin-ad</artifactId>
<groupId>com.herobin.ad</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ad-gateway</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 模块名及描述信息 -->
<name>ad-gateway</name>
<description>ad-gateway</description>
<!-- eureka server: 提供服务发现与服务注册 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 9000
spring:
application:
name: ad-gateway
eureka:
client:
service-url:
defaultZone: http://server1:8000/eureka/ # 启动时会根据这里地址向eureka server中注册
启动类ZuulGatewayApplication
注意这里用到的注解@EnableZuulProxy
和@SpringCloudApplication
.
package com.herobin.ad;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
/**
* @author binzhang
* @date 2019-05-02
*/
@EnableZuulProxy
@SpringCloudApplication
public class ZuulGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class,args);
}
}
先启动eureka server启动类再启动eureka client启动类,可以发现如图已经注册到eureka server中了
项目github地址:https://github.com/zhangbin1995/ad-spring-cloud