添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Eureka 又称 服务注册中心,全部服务都需要进行注册才能使用,也是微服务架构中必不可少的一个组件。

本章小编给大家讲解Eureka的使用方式,以及实战演示案例。

版本:Spring Boot (2.1.3.RELEASE)、Spring Cloud  (Greenwich.SR1),版本对应很重要,很多小伙伴因为版本不对而踩坑的案例很多啦,小编也是一路踩过来的。

实战案例主要内容

服务 :1、注册中心服务端  2、商品服务  3、订单服务

需求 :订单服务需要查询商品信息完成下单服务, 服务商品提供商品查询的接口并且注册到服务中心,订单服务通过服务中心调用商品服务,从而拿到商品信息。

二、Eureka 服务端

步骤一 :使用IDEA快速创建Spring Boot项目,并且选择Eureka服务端( 记得把Web的引用也勾选上,不然会出现项目启动不了的情况 )

步骤二 :在Spring Boot启动类上加Eureka服务端注解

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

步骤三:直接启动见证奇迹吧,默认端口应该是8080,http://localhost:8080,看到如下页面则表示服务端成功。

步骤四:如果按照以上步骤启动成功,控制台应该会抛出一下一段异常信息。这个异常是表示Eureka启动时会注册自己本身服务,而本身服务却还没启动成功,则抛出异常。

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)

解决办法:修改Eureka默认配置,小编默认习惯使用yml格式的配置文件,修改配置如下:

################ 项目基本配置 ################
spring:
  application:
    # 对应注册Eureka中的服务名
    name: eureka
################ Eureka配置 ################
eureka:
  client:
    # 防止Eureka启动时注册本身服务
    register-with-eureka: false
    fetch-registry: false

三、Eureka 客户端

针对实战案例来说,需要创建一个商品项目、订单项目并且都需要注册到Eureka服务中心,以商品服务为例:

步骤一:还是采用IDEA快速创建Spring Boot项目,并且选择Eureka客户端依赖(记得吧Web也勾选上,不然会出现项目启动不了)

步骤二:配置Eureka服务端地址,还是yml格式的哟。

################ 项目基本配置 ################
server:
  port: 8010
  servlet:
    # 项目访问路径前缀
    context-path: /product
spring:
  application:
    # 注册到Eureka的服务名
    name: product
################ Eureka配置 ################
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8080/eureka

步骤三:SpringBoot启动类上加上Eureka客户端注解,直接启动吧

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ProductApplication {
	public static void main(String[] args) {
		SpringApplication.run(ProductApplication.class, args);

步骤四:然后访问eureka后台管理页面,会发现有一个PRODUCT服务注册进来了,则表示没问题。

步骤五:我们会发现商品服务注册上来之后,页面会提示如下一句话,这个表示Eureka对我们其他服务进行一个检测,既然我们是这是开发环境,则可以暂时先关闭掉。

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

################ Eureka配置 ################ eureka: client: # 防止Eureka启动时注册本身服务 register-with-eureka: false fetch-registry: false server: # 在开发环境时关闭服务心跳检测提示,在生产环境需要改为True enable-self-preservation: false

四、Eureka 高可用

既然我们Eureka控制全场服务,那么单个服务注册中心肯定不够用,万一出现单点故障那就凉凉了。

所以再来说说Eureka怎么实现高可用,看Eureka服务端配置

################ Eureka配置 ################
eureka:
  client:
    # 防止Eureka启动时注册本身服务
    register-with-eureka: false
    fetch-registry: false
    service-url:
      # 另外一个Eureka服务地址,这里小编自定义了启动端口分别是:8761、8762
      defaultZone: http://localhost:8761/eureka
  server:
    # 在开发环境时关闭服务心跳检测提示,在生产环境需要改为True
    enable-self-preservation: false

启动两个eureka的项目,并且相互注册即可。

是不是炒鸡简单,只需要服务端往另外一个服务端注册即可,怎么看效果?

启动两个Eureka服务端,并且相互注册,然后我们使用商品服务往其中一个Eureka服务注册,如果看到两个Eureka服务端后台页面都有PRODUCT服务注册进来了,则表示成功。

有一个问题,现在我们商品服务只是往其中一个Eureka服务进行注册了,如果高可用其中一台Eureka挂掉了,那么商品服务再次注册的时候就会有问题,所以我们商品服务、订单服务注册Eureka的配置就需要改动,如下

################ Eureka配置 ################
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

五、Eureka 服务与服务之间调用方式

好了,以上全部内容都只是铺垫,以上只是演示了商品服务,那么订单服务也是同样的道理,都往Eureka上注册即可,小编就不说啦。

实战来啦,现在订单服务下单,订单服务需要通过前端传来的商品ID,调用商品的服务从而获取商品的金额、库存等。

商品服务:需要提供一个接口通过商品id查询商品具体信息,具体代码就不说了,重点在于订单服务怎么调用。

订单服务:已知商品ID,需要获取商品信息。

使用RestTemplate调用商品服务:

方式一:第一种方式很简单,直接调用RestTemplate方法即可。

* 第一种方式直接指定路径,传参调用 * @param productId * @return @GetMapping("/getOneProductById") public Object getOneProductById(@RequestParam("productId") Integer productId){ MultiValueMap<String,Object> params = new LinkedMultiValueMap<>(); params.add("productId",productId); RestTemplate template = new RestTemplate(); return template.postForObject("http://localhost:8010/product/getProductById", params, String.class);

方式二:通过LoadBalancerClient对象,需要你需要调用的服务,从而获得该服务的IP、端口信息等

    @Autowired
    private LoadBalancerClient loadBalancerClient;
     * 通过loadBalancerClient获取到注册服务对应到地址以及对应到端口号
     * @param productId
     * @return
    @GetMapping("/getTwoProductById")
    public Object getTwoProductById(@RequestParam("productId") Integer productId){
        // 这里的PRODUCT对应注册Eureka的服务名
        ServiceInstance instance = loadBalancerClient.choose("PRODUCT");
        String url = String.format("http://%s:%s/product/getProductById",instance.getHost(),instance.getPort());
        MultiValueMap<String,Object> params = new LinkedMultiValueMap<>();
        params.add("productId",productId);
        RestTemplate template = new RestTemplate();
        return template.postForObject(url, params, String.class);

方式三:需要配置一个Bean,主要是标注了LoadBalanced该注解。需要使用通过注解直接注入RestTemplate该对象,即可使用,代码如下:

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
 * @Auther: IT贱男
 * @Date: 2019/3/26 10:39
 * @Description:
@Component
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    @Autowired
    private RestTemplate restTemplate;
     * 通过配置RestTemplate对象,通过服务名调用
     * @param productId
     * @return
    @GetMapping("/getThreeProductById")
    public Object getThreeProductById(@RequestParam("productId") Integer productId){
        MultiValueMap<String,Object> params = new LinkedMultiValueMap<>();
        params.add("productId",productId);
        // PRODUCT 对应注册Eureka中的服务名字
        return restTemplate.postForObject("http://PRODUCT/product/getProductById", params, String.class);

使用Feign调用方式

首先我们需要引入依赖的Jar

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

配置每个服务的接口类,参数和路径都和商品服务一一对应。小编个人感觉这种方式稍微比较规范一点,实际项目中也使用的偏多。

* @Auther: IT贱男 * @Date: 2019/3/26 10:48 * @Description: 定义商品服务接口信息 @FeignClient(value = "PRODUCT") public interface ProductFeignClient { @PostMapping("/product/getProductById") String getProductById(@RequestParam("productId") Integer productId);

使用方式注解注入服务接口定义类即可。

* @Auther: IT贱男 * @Date: 2019/3/26 10:50 * @Description: 通过Feign实现调用商品服务 @RestController public class OrderFeignController { @Autowired private ProductFeignClient productFeignClient; @GetMapping("/feign/getProductById") public String getProductById(@RequestParam("productId") Integer productId){ return productFeignClient.getProductById(productId);

最最最最后千万要记住,SpringBoot启动类上需要加上Feign的注解。

@SpringBootApplication @EnableEurekaClient @EnableFeignClients public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args);

最后效果都是能通过订单服务获取到商品信息的,才算没问题。

Eureka是学习使用SpringCloud微服务的第一步,掌握服务的注册与发现是很基本的操作。

本实战案例以上传CSDN下载资源中,点击下载

后续组件都会通过本案例继续进行演示,如果本文又帮助到你,点个赞呗~~~

<img src="https://img-bss.csdn.net/201904250321353005.png" alt="" />微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底<br /> 地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,<br /> 从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动<br /><p> 或销毁,拥有自己独立的数据库。 <br /></p> 介绍不必过多,一起进入实战吧!!
1. Eureka是什么 Eureka是一个基于REST的服务,主要用于AWS云中的定位服务,以实现中间层服务器的负载平衡和故障转移 在 Spring Cloud 微服务架构中通常用作注册中心 我们称这个服务为 Eureka Server,还有一个与之交互的客户端称之为 Eureka Client 2. Eureka高级架构 如上图所示,其中 Application Serve...
服务注册中心:Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-demo 服务提供者:提供服务的应用,可以是SpringBoot应用,也可以是其它技术实现,只要对外提供的是Rest风格服务即可。 服务消费者:消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。 Eureka就好比是滴滴,负责管理、记录服务提供者的信息。服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你.
Eureka 工作原理 上节内容为大家介绍了,注册中心 Eureka 产品的使用以及如何利用 Eureka 搭建单台和集群的注册中心。这节课我们来继续学习 Eureka,了解它的相关概念、工作流程机制等。 Eureka 作为 Spring Cloud 体系中最核心、默认的注册中心组件,研究它的运行机制,有助于我们在工作中更好地使用它。 Eureka 核心概念 回到上节的服务注册调用示意图,服务提...
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEu. 看着这个图标,就感觉到了SpringEureka之间浓浓的基情。 Spring Cloud EurekaSpring对Netflix公司的Eureka的二次封装的产品,它实现了服务治理的功能,Spring Cloud Eureka提供了服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。 在说微服务之前,先讲讲项目的功能拆分问题。 功能拆分对我们来说并不陌生,曾记否刚入坑编程时的那段光辉岁月?你小心翼翼地将一大坨代码按功能切 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> 完整的pomxml <?xml version="1.0" encoding="UTF-8"?>
一、Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。 1.Eureka包含两个组件:Eureka Ser...
&nbsp; Spring Cloud Eureka 能实现服务的注册和发现,下面使用IntelliJ IDEA + maven 从0开始搭建 Eureka Server。 &nbsp; 1、新建项目,选择 Spring Initializr,JDK 1.8,选择默认的 https://start.spring.io ,如网速不好,请自行科学上网,Next: &nbsp; 2、编辑 Group 和 Artifac...
开发工具:idea; springboot版本:2.1.13 springcloud版本:Finchley.SR1(注意,此处使用的是springboot2.0.x以上的版本,而springcloud对应的版本为Finchley,且springboot2.0相比于springboot1.5.x来说,maven依赖变化较大,这个问题在搭建分布式项目时我会做出说明) 中间件:eurek...
&emsp; &emsp;我的博客:兰陵笑笑生,欢迎浏览博客! &emsp; &emsp;上一章 SpringCloud基础教程(二)-服务发现 Eureka当中,我们介绍了微服务组件当中的服务注册和发现组件 Eureka,本章将继续探索Eurea在生产环境中的配置和使用。 &emsp;在上一章当中,我们初步了解了Eureka使用,虽然最基本的场景,服务注册、服务发现和消费都可以实现。但...
1.1 服务治理 服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现。 Spring Cloud EurekaSpring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装。主要负责完成微服务架构中的服务治理功能。 &nbsp; QueryWrapper<School> wrapper = new QueryWrapper(); wrapper.orderByDesc("s_id"); IPage<School> schoolIPage = new Page<>(3,3); Page<School> iPage = schoolMapper.selectTest(schoolIPage,wrapper); //IPage<School> iPage = schoolMapper.selectPage(schoolIPage,wrapper); List<School> list = iPage.getRecords(); System.out.println(list); long total = iPage.getTotal(); long current = iPage.getCurrent(); long size = iPage.getSize(); long pages = iPage.getPages(); System.out.println("total:"+total); System.out.println("current:"+current); System.out.println("size:"+size); System.out.println("pages"+pages); [null, null, null] total:10 current:3 size:3 pages4 兄弟,返回结果集是null,怎么回事 MyBatis-Plus 分页查询以及自定义sql分页 Christian_sno: 很关键,有帮助!!