在我之前发布的关于SpringCloud分布式框架的介绍,相信大家已经对SpringCloud中的组件已经有了很大的了解,这些组件基本涵盖了微服务架构中最为基础的几个核心设施,利用这些组件我们已经可以构建起一个简单的微服务架构系统,比如,通过使用Spring Cloud Eureka实现高可用的服务注册中心以及实现微服务的注册与发现;通过Spring Cloud Ribbon或Feign实现服务间负载均衡的接口调用;同时,为了使分布式系统更为健壮,对于依赖的服务调用使用Spring Cloud Hystrix来进行包装,实现线程隔离并加入熔断机制,以避免在微服务架构中因个别服务出现异常而引起级联故障蔓延。在该架构中,我们的服务集群包含内部服务ServiceA和ServiceB, 它们都会向Eureka Server集群进行注册与订阅服务,而OpenService是一个对外的RESTfulAPI服务,它通过FS、 Nginx等网络设备或工具软件实现对各个微服务的路由与负载均衡,并公开给外部的客户端调用。
今天我介绍的将是另一个技术,他叫做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文件夹
2.接着创建common项目,此项目的目的是为了整合jar包和实体类。
3.创建springboot项目勾选cloud discovery --》Eureka Server创建Eureka注册中心。
在配置类配置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注册中心,出现如下图表示访问成功
4.创建一个生产者springcloud-provider,记得勾选Eureka Discover选项
配置生产者的配置文件
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
配置消费者的配置类
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分布式框架现在就已经搭建完成了
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;
}
}
接下来可就注意啦!!!!
消费者的service层接口要使用extends继承的方式来与api中的service接口产生联系!
我们首先在消费者中创建service接口
然后在Api中也创建一个Service接口
然后注意:消费者的service接口继承Api中的接口产生联系。如下图红圈所示,继承API中的service接口
package com.jk.service;
import org.springframework.cloud.openfeign.FeignClient;
//生产者实例名
@FeignClient(value = "springcloud-provider")
public interface OrderServiceFeign extends OrderService{
}
接下来controller层的select方法要实现,注意不是在消费者自己的service接口实现,而是在api中的service接口实现
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 {
}
现在就可以实现方法了
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 "请求成功!!!";
}
}
然后我们访问请求路径
请求成功了!! 结合Hystrix断路器我之前的博客有详细过程,这里不再赘述,实现方式其实并没有变化。和以前一样。
才疏学浅,谢谢观看。