SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。

一、前言

在我之前发布的关于SpringCloud分布式框架的介绍,相信大家已经对SpringCloud中的组件已经有了很大的了解,这些组件基本涵盖了微服务架构中最为基础的几个核心设施,利用这些组件我们已经可以构建起一个简单的微服务架构系统,比如,通过使用Spring Cloud Eureka实现高可用的服务注册中心以及实现微服务的注册与发现;通过Spring Cloud Ribbon或Feign实现服务间负载均衡的接口调用;同时,为了使分布式系统更为健壮,对于依赖的服务调用使用Spring Cloud Hystrix来进行包装,实现线程隔离并加入熔断机制,以避免在微服务架构中因个别服务出现异常而引起级联故障蔓延。在该架构中,我们的服务集群包含内部服务ServiceA和ServiceB, 它们都会向Eureka Server集群进行注册与订阅服务,而OpenService是一个对外的RESTfulAPI服务,它通过FS、 Nginx等网络设备或工具软件实现对各个微服务的路由与负载均衡,并公开给外部的客户端调用。

二、API简介

今天我介绍的将是另一个技术,他叫做API网关。API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Facade模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤。它除了要实现请求路由、 负载均衡、 校验过滤等功能之外,还需要更多能力,比如与服务治理框架的结合、请求转发时的熔断机制、服务的聚合等一系列高级功能。

在SpringCloud中了提供了基于NetflixZuul实现的API网关组件Spring Cloud Zuul。那么,它是如何解决上面这两个普遍问题的呢?

首先,对于路由规则与服务实例的维护间题。SpringCloud Zuul通过与SpringCloud Eureka进行整合,将自身注册为Eureka服务治理下的应用,同时从Eureka中获得了所有其他微服务的实例信息。这样的设计非常巧妙地将服务治理体系中维护的实例信息利用起来,使得将维护服务实例的工作交给了服务治理框架自动完成,不再需要人工介入。
其次,对千类似签名校验、登录校验在微服务架构中的冗余问题。SpringCloud Zuul提供了一套过滤器机制,它可以 很好地支持这样的任务。开发者可以通过使用Zuul来创建各种校验过滤器,然后指定哪些规则的请求需要执行校验逻辑,只有通过校验的才会被路由到具体的微服务接口,不然就返回错误提示。通过这样的改造,各个业务层的微服务应用就不再需要非业务性质的校验逻辑了,这使得我们的微服务应用可以更专注千业务逻辑的开发,同时微服务的自动化测试也变得更容易实现。

简单来说,就是既具备路由转发功能,又具备过滤器功能,比如将/aaa/**路径请求转发到service-ribbon服务上,将/bbb/***路径请求转发到service-feign服务上,比如过滤,对请求参数的信息进行过滤,不符合的进行过滤拦截等。
 

三、前期准备

1.一个服务注册中心,EUREKASERVER,端口为5555;
2.COMMON项目整合所需jar包与实体Bean
3.一个生产者项目通过EUREKA发布接口
4.一个消费者调用生产者发布的接口
5.创建api网关。

 

四、实例

1.新建maven项目,实现父子级项目结构。并且删除src文件夹

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第1张图片

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第2张图片

2.接着创建common项目,此项目的目的是为了整合jar包和实体类。

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第3张图片

3.创建springboot项目勾选cloud discovery --》Eureka Server创建Eureka注册中心。

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第4张图片

在配置类配置Eureka注册服务 Eureka Server

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  server:
    enable-self-preservation: false

spring:
  application:
    name: springcloud-eureka

.在启动类上加@EnableEurekaServer 启用eureka服务端  

package com.jk.app;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
 
}

启动项目访问路径地址,访问Eureka注册中心,出现如下图表示访问成功

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第5张图片

4.创建一个生产者springcloud-provider,记得勾选Eureka Discover选项

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第6张图片

配置生产者的配置文件

server:
  port: 8765
 
spring:
  application:
    name: springcloud-user-reg
 
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

启动类需要加@EnableEurekaClient注解

package com.jk.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class SpringcloudProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudProviderApplication.class, args);
    }

}

5.接着创建消费者的项目,创建项目选择 Web  Eureka Discover  Feign

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第7张图片

配置消费者的配置类


server:
  port: 8672

spring:
  application:
    name: springcloud-consumer

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

同样在在启动类上加注解

@EnableFeignClients
@EnableEurekaClient

package com.jk.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
public class SpringcloudConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudConsumerApplication.class, args);
    }

}

6.创建API网关,为maven结构,基本的SpringCloud分布式框架现在就已经搭建完成了

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第8张图片

7.接下来我们创建测试方法,看看他们是如何调用的,与API又是如何交互。

从消费者开始写起,新建controller包,创建controller类,我们写一个测试方法

package com.jk.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @Autowired
    private OrderServiceFeign orderServiceFeign;

    @GetMapping("select")
    public String select(){
        String result = OrderServiceFeign.select();
        return result;
    }

}

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第9张图片

接下来可就注意啦!!!!

消费者的service层接口要使用extends继承的方式来与api中的service接口产生联系!

我们首先在消费者中创建service接口

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第10张图片

 

然后在Api中也创建一个Service接口

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第11张图片

然后注意:消费者的service接口继承Api中的接口产生联系。如下图红圈所示,继承API中的service接口

package com.jk.service;


import org.springframework.cloud.openfeign.FeignClient;

//生产者实例名
@FeignClient(value = "springcloud-provider")
public interface OrderServiceFeign extends OrderService{

}

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第12张图片

接下来controller层的select方法要实现,注意不是在消费者自己的service接口实现,而是在api中的service接口实现

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第13张图片

api中service接口中的方法实现

package com.jk.service;

import org.springframework.web.bind.annotation.RequestMapping;

public interface OrderService {

    @RequestMapping("select")
    String select();
}

8.接下来我们来写生产者,创建controller包与controller类

  注意啦,生产者的controller我们不需要写方法,只需要来实现它!

package com.jk.controller;


import com.jk.service.OrderService;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController implements OrderService {
    
}

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第14张图片

现在就可以实现方法了

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第15张图片

package com.jk.controller;


import com.jk.service.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController implements OrderService {

    @GetMapping("select")
    @Override
    public String select() {
        return "请求成功!!!";
    }
}

然后我们访问请求路径

SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。_第16张图片

请求成功了!!      结合Hystrix断路器我之前的博客有详细过程,这里不再赘述,实现方式其实并没有变化。和以前一样。

才疏学浅,谢谢观看。

你可能感兴趣的:(SpringCloud分布式框架使用EUREKA注册中心,整合API网关服务。)