Spring Cloud应用中可以支持多种的服务治理框架,比如Eureka、Consul、Zookeeper等,现在我们用的是consul,本文以SpringCloud Dalston.SR5版本介绍Eureka的使用:

  • 创建服务注册中心
  • 创建服务提供者
  • 创建服务消费者
  • 服务消费
  • 踩的坑

一、创建服务注册中心

1.创建一个基础SpringBoot工程,命名为eureka-server

2.修改pom.xml

(1)修改一:SpringCloud版本管理

<!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

(2)修改二:添加Eureka Server 起步依赖

 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

(3)完整pom.xml

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zrk</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Eureka Server</description> <!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

3.修改主启动类

只需在主启动类上添加@EnableEurekaServer注解就可以启动一个服务注册中心:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

官方文档截图

4.修改配置

修改配置文件,如application.properties,也可用application.yml(官方文档使用)等:

spring.application.name=eureka-server
server.port=8761 eureka.instance.hostname=localhost
#不把自己注册到注册中心
eureka.client.register-with-eureka=false
#不去发现服务
eureka.client.fetch-registry=false
#服务注册中心url
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

启动工程,访问http://localhost:8761

可以看到Eureka管理页面,看到No instances available,表示还没有实例注册到注册中心。

注:后续就会发现SpringCloud整合其他框架时都是先导入对应起步依赖,再添加对应注解,再修改配置

更多详细配置可以参考EurekaInstanceConfigBean.java and EurekaClientConfigBean.java。

二、创建服务提供者

1.创建一个基础SpringBoot工程,命名为eureka-provider-user

2.修改pom.xml

(1)修改一:SpringCloud版本管理

    <!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

(2)修改二:添加Eureka起步依赖

   <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

(3)完整pom.xml

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zrk</groupId>
<artifactId>eureka-provider-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-provider-user</name>
<description>Eureka Client</description> <!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

3.修改主启动类

只需在主启动类上添加@EnableEurekaClient注解,也可使用@EnableDiscoveryClient注解,两个注解都能激活Eureka中的DiscoveryClient实现,只是前者仅限于使用Eureka的情况下使用。

@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient
public class EurekaProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderUserApplication.class, args);
}
}

4.修改配置

spring.application.name=provider-user
server.port=8081
#设置服务注册中心的URL
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

启动该工程,访问http://localhost:8761

可以看到provider-user服务已经注册成功!

5.添加业务逻辑

(1)UserController.java

@RestController
@RequestMapping("user")
public class UserController
{
@RequestMapping(value = "getUserById/{id}")
public User getUser(@PathVariable Integer id){
User user = new User();
user.setId(id);
user.setName("张三");
user.setPassword("123");
return user;
}
}

(2)User.java

public class User {
private Integer id;
private String name;
private String password; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

三、创建服务消费者

1.创建一个基础SpringBoot工程,命名为eureka-consumer-basketball

2.修改pom.xml

(1)修改同eureka-provider-user,只是多了web相关依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

(2)完整pom.xml

<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zrk</groupId>
<artifactId>eureka-consumer-basketball</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-consumer-basketball</name>
<description>Eureka Client</description> <properties>
<java.version>1.8</java.version>
</properties> <!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

3.修改主启动类

在主启动类上添加@EnableDiscoveryClient注解,并添加RestTemplate组件

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaConsumerBasketballApplication { @Bean(name = "restTemplate")
RestTemplate restTemplate() {
return new RestTemplate();
} public static void main(String[] args) {
SpringApplication.run(EurekaConsumerBasketballApplication.class, args);
} }

4.修改配置

spring.application.name=consumer-basketball
server.port=8082
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

5.添加业务逻辑

(1)BasketballController.java

@RestController
public class BasketballController { @Resource
private RestTemplate restTemplate; @RequestMapping(value = "getUser/{id}")
public User getUserById(@PathVariable Integer id){
return this.restTemplate.getForObject("http://provider-user/user/getUserById/" + id,User.class);
}
}

(2)User.java

public class User {
private Integer id;
private String name;
private String password; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

启动该工程,访问http://localhost:8761

可以看到consumer-basketball服务已经注册成功!

四、服务消费

浏览器访问http://localhost:8082/getUser/1

报了 java.net.UnknownHostException: provider-user异常,发现通过provider-user服务名直接访问不可以,查询后需要加@loadBalance注解才能用服务名访问,调整如下:

(1)修改一:添加ribbon依赖

<!-- ribbon ,实现客户端负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

(2)修改二:加@loadBalance

重启工程,再次访问http://localhost:8082/getUser/1

访问成功!

五、踩的坑

1、网速慢下载maven很慢

  在网速慢的情况下下载maven依赖特别慢,可以通过修改setting.xml解决

  参考链接:https://www.cnblogs.com/zrk3/p/maven_speed_up.html

2、版本兼容问题

  SpringCloud跟SpringBoot存在版本兼容问题,导致启动报错java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder

 参考链接:https://www.cnblogs.com/zrk3/p/10405989.html

3、服务名访问问题

  消费者通过生产者服务的服务名进行访问时报 java.net.UnknownHostException异常。

 参考链接:https://blog.csdn.net/qq_18416057/article/details/79432504

SpringCloud 学习(二) :服务注册与发现Eureka的更多相关文章

  1. spring cloud 学习之 服务注册和发现(Eureka)

    一:服务注册和发现(Eureka) 1:采用Eureka作为服务注册和发现组件 2:Eureka 项目中 主要在启动类加上 注解@EnableEurekaServer @SpringBootAppli ...

  2. SpringCloud(二) 服务注册与发现Eureka

    1.eureka是干什么的? 上篇说了,微服务之间需要互相之间通信,那么通信就需要各种网络信息,我们可以通过使用硬编码的方式来进行通信,但是这种方式显然不合适,不可能说一个微服务的地址发生变动,那么整 ...

  3. SpringCloud学习1-服务注册与发现(Eureka)

    由于样式兼容性问题,本文后半部分被截断,可到个人博客找到本文: https://blog.rmiao.top/springcloud-eureka/ 前言 Oracle转让Java,各种动态语言的曝光 ...

  4. springCloud学习之服务注册和发现

    leader让完一个简单的springcloud的demo,自己之前听说过springcloud微服务,但是没有重视.现在网上查各种资料,但是感觉不怎么样啊,还是不会,明天晚上把代码给他看,天啦,这个 ...

  5. Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】

    Spring Cloud(二):服务注册与发现 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇主要介绍了相关理论,这一篇开始我们 ...

  6. 小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战

    笔记 5.服务注册和发现Eureka Server搭建实战     简介:使用IDEA搭建Eureka服务中心Server端并启动,项目基本骨架介绍          官方文档:http://clou ...

  7. SpringCloud全家桶学习之服务注册与发现及Eureka高可用集群搭建(二)

    一.Eureka服务注册与发现 (1)Eureka是什么? Eureka是NetFlix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故 ...

  8. SpringCloud(二)- 服务注册与发现Eureka

    离上一篇微服务的基本概念已经过去了几个月,在写那篇博客之前,自己还并未真正的使用微服务架构,很多理解还存在概念上.后面换了公司,新公司既用了SpringCloud也用了Dubbo+Zookeeper, ...

  9. SpringCloud学习笔记:服务注册与发现Eureka(2)

    1. Eureka简介 Eureka是一个用于服务注册和发现的组件,分为Eureka Server和Eureka Client,Eureka Server为Eureka服务注册中心,Eureka Cl ...

随机推荐

  1. 前端统计利器:Sentry & Matomo

    今天主要说下两款前端统计工具的使用,Sentry & Matomo.以下主要是统计代码接入方式,因此使用前提是你已经在自己的服务器上搭建好了Sentry和Matomo的服务器 Sentry统计 ...

  2. Echarts 曲线数少于图例数解决方法

    在上一篇文章 Echarts 多曲线“断点”问题解决方法 中说到了Angular 项目中要使用 Echarts 的方法. 说明了自己解决当“每一条曲线的横坐标不相同”时,在各条曲线上,它们的值采用数组 ...

  3. impdp导入expdp导出数据库实例

    impdp命令在cmd下直接用,不必登录oracle.只能导入expdp导出的dmp文件. expdp导出的时候,需要创建 DIRECTORY 导出什么表空间,导入也要什么表空间. 导出什么用户,导入 ...

  4. [翻译]怎么写一个React组件库(一)

    本文同步发布于知乎专栏 https://zhuanlan.zhihu.com/p/27401329,喜欢本文的就去知乎点个赞支持下吧- 引言 该系列文章将通过创建一个组件库来引导你学习如何构建自己的组 ...

  5. [luogu1081] 开车旅行

    题面 ​ 这个题目还是值得思考的. ​ 看到这个题目, 大家应该都想到了这样一个思路, 就是把每个点能够达到的最近的和次近的点都预处理出来, 然后跑就可以了, 现在问题就是难在这个预处理上面, 我们应 ...

  6. linux文件系统初始化过程(5)---加载initrd(下)

    一.目的 linux把文件分为常规文件.目录文件.软链接文件.硬链接文件.特殊文件(设备文件.管道文件.socket文件等)几种类型,分别对应不同的新建函数sys_open().sys_mkdir() ...

  7. 【C++0x】表达式之类型(decltype)

      C++0x引入了新的关键字decltype,它是一个操作符,用来取得表达式的类型,主要在泛型编程中使用.这里,简单介绍一下语法规则. 语法形式:decltype (expression)其中,这里 ...

  8. 在Linux中连接android设备

    1.用usb线连接电脑和android设备,在命令行中输入lsusb可查看采用usb连接到电脑的设备 找到设备的vendor ID. 如上图: "Bus 002 Device 007: ID ...

  9. springboot快速入门(四)——数据库操作

    一.Spring-Data-Jpa的引入 先给出官方文档:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ IBM ...

  10. 课下测试补交(ch03 ch08)

    课下测试补交(ch03 ch08) 课下测试 ch03 1.有关gdb调试汇编,下面说法正确的是(ABCE) A . 可以用disas反汇编当前函数 B . 以16进制形式打印%rax中内容的命令是 ...