Skip to main content

作业07:微服务

作业7 微服务

选题:开发一个微服务,输入为书名,输出为书的作者。将此微服务单独部署,并使用netflix-zuul 或其他你擅长使用的工具进行路由,在你的E-Book 系统中使用该服务来完成作者搜索功能。请你编写文档,用你编写的这个微服务为例,解释Gateway 和Service Registry 在微服务架构中都起到了什么作用?在文档中还需要说明你的服务的部署与使用方式。

一、回答问题

Gateway的作用:GateWay起到请求分流的作用,相当于所有服务的门户,将客户端请求与服务端应用相分离,客户端请求到达gateway后,gateway会根据请求的URL判断,然后根据判断的结果(比如以某个特定字符开头的URL)转发到对应的处理相关服务的地址。

Service Registry的作用:相当于一个注册表,当一个微服务的服务器启动的时候(包括GateWay),他会到Service Registry这个注册表上注册自己的服务,这样Gateway在面对客户端请求到来的时候,就会根据这个注册表来把请求转发给相关的微服务的服务器。

如下图所示:Service Registry可以看到注册的相关的服务的名称。

截屏2022-11-16 21.45.10

微服务的部署方式:如下图,为了方便演示,我配置了相关模块的启动配置。其中微服务涉及到的包括:Eureka模块(相当于上面所说的注册表,Service Registry);GateWay(就是下面的GateWay),MicroService(处理这个搜索作者的功能的微服务),当然剩下的一个是我的原来是的后端。

在实际的部署中:

  • 首先需要启动注册表服务器,因为其他的服务器启动的时候都要到服务注册这里来注册一下,所以必须要最先启动Eureka的这个服务。
  • 然后启动微服务具体的服务器(就是我那个处理搜索的服务的),在这个服务器启动的时候会自动到注册表服务器里面注册一下,便于后面的GateWay能够找得到。
  • 最后启动GateWay,因为具体的业务服务器已经启动了,启动GateWay之后,用户的请求就可以转发到对应的微服务,如果先启动GateWay而没有启动具体的业务服务器,如果有请求发来就会导致GateWay找不到对应的微服务的服务器,然后出现报错。

截屏2022-11-16 21.32.26

二、截图

微服务的效果:

截屏2022-11-16 21.23.33

这个是数据库的图,和上面的是一致的。

截屏2022-11-16 21.26.17

三、代码

(一)处理搜索的微服务

由于这个服务非常的简单,就不做特别复杂的分层。代码的原理就是搜索书的名称,然后返回作者信息。

截屏2022-11-16 21.48.34

(二)GateWay的代码

由于我所有微服务的URL都是以/microservice开头的,所以通过下面的代码可以识别出,然后转发给对应的服务处理端。

package com.zzq.ebook.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;


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

@Bean
public RouteLocator myRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.path("/microservice/**")
.filters(f -> f.rewritePath("/microservice",""))
.uri("lb://BOOK-SERVICE")
)
.build();
}
}
三、Eureka

下面是配置信息,配置端口,服务发现的地址:

server:
port:
8040
spring:
application:
name: Eureka
eureka:
instance:
prefer-ip-address: true
client:
fetch-registry: false
register-with-eureka: false
serviceUrl:
defaultZone: http://localhost:8040/eureka

主类也非常的简单,如下就可以运行。

package com.zzq.ebook.eureka;

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

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