共计 4016 个字符,预计需要花费 11 分钟才能阅读完成。
这篇文章给大家分享的是有关 Spring Cloud 集群怎么使用 Zuul 的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
Spring Cloud 集群使用 Zuul
在前面小节的例子中,Zuul 将请求转发到一个 Web 项目进行处理,如果实际处理请求的不是一个 Web 项目,而是整个微服务集群,那么 Zuul 将成为整个集群的网关。在加入 Zuul 前,Spring Cloud 集群的结构请见图 7 -3。
图 7 -3 原来的 Spring Cloud 集群结构
为微服务集群加入 Zuul 网关后,结构如图 7 - 4 所示。
图 7 -4 加入 Zuul 后集群结构
在深入学习 Zuul 前,先按图 7 - 4 的搭建本章的测试项目。
集群搭建
假设当前需要实现一个书本销售业务,在销售模块中需要调用书本模块的服务,用来查找书本,本小节案例以此为基础,建立以下项目:
zuul-eureka-server:Eureka 服务器,应用端口为 8761,读者可以到以下目录取得源代码:codes\07\03\zuul-eureka-server。
zuul-book-service:书本模块,属于服务提供者,提供“/book/{bookId}”服务,用于查找图书,最后返回 Book 的 JSON 字符串,应用端口为 9000,代码目录 codes\07\03\zuul-book-service。
zuul-sale-service:销售模块,属于服务调用者,对外发布销售服务“/sale-book/{bookId}”,该服务中会调用 zuul-book-service 来查找 Book,应用端口为 9100,代码目录 codes\07\03\zuul-sale-service。
书本模块“zuul-book-service”发布的服务,仅返回一个简单的 Book 对象,控制器代码如下:
@RequestMapping(value = /book/{bookId} , method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public Book findBook(@PathVariable Integer bookId) { Book book = new Book();
book.setId(bookId);
book.setName( Workflow 讲义
book.setAuthor( 杨恩雄
return book;
}
销售模块“zuul-sale-service”发布的服务,相关代码如下:
@FeignClient(zuul-book-service) // 声明调用书本服务
public interface BookService {
/**
* 调用书本服务的接口,获取一个 Book 实例
*/
@RequestMapping(method = RequestMethod.GET, value = /book/{bookId} )
Book getBook(@PathVariable( bookId) Integer bookId);
@RestController
public class SaleController {
@Autowired
private BookService bookService;
@RequestMapping(value = /sale-book/{bookId} , method = RequestMethod.GET) public String saleBook(@PathVariable Integer bookId) {
// 调用 book 服务查找
Book book = bookService.getBook(bookId);
// 控制台输入,模拟进行销售
System.out.println(销售模块处理销售,要销售的图书 id: + book.getId() + , 书名: + book.getName());
// 销售成功
return SUCCESS
}
}
销售模块的服务,使用 Feign 来调用书本模块的服务来获取 Book 实例,然后在控制台中输出信息,在实际应用中,销售的过程会更为复杂,例如有可能涉及支付等内容,本例为了简单起见,仅作简单的输出。接下来,创建网关项目。
路由到集群服务
在前一小节的基础上,新建一个名称为“zuul-gateway”的 Maven 项目(代码目录 codes\07\03\zuul-gateway),在 pom.xml 中加入以下依赖:
dependency
groupId org.springframework.cloud /groupId
artifactId spring-cloud-starter-config /artifactId
/dependency
dependency
groupId org.springframework.cloud /groupId
artifactId spring-cloud-starter-eureka /artifactId
/dependency
dependency
groupId org.springframework.cloud /groupId
artifactId spring-cloud-starter-zuul /artifactId
/dependency
dependency
groupId org.apache.httpcomponents /groupId
artifactId httpclient /artifactId
version 4.5.3 /version
/dependency
新建应用类,如代码清单 7 - 3 所示。
代码清单 7 -3:
codes\07\03\zuul-gateway\src\main\java\org\crazyit\cloud\GatewayApplication.java
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication { public static void main(String[] args) { new SpringApplicationBuilder(GatewayApplication.class).properties( server.port=8080).run(args);
}
}
应用类跟前面的例子一致,使用 @EnableZuulProxy 注解,但是,由于网关项目需要加入到集群中,因此要修改配置文件,让其注册到 Eureka 服务器中。本例的配置文件如代码清单 7 -4。
代码清单 7 -4:codes\07\03\zuul-gateway\src\main\resources\application.yml
spring:
application:
name: zuul-gateway
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
sale:
path: /sale/**
serviceId: zuul-sale-service
使用 eureka 的配置,将自己注册到 8761 的 Eureka 中。在配置 Zuul 时,声明所有的“/sale/**”请求,将会被转发到 Id 为“zuul-sale-service”的服务进行处理。
一般情况下,配置了 serviceId 后,在处理请求的“routing”阶段,将会使用一个名称为 RibbonRoutingFilter 的过滤器,该过滤器会调用 Ribbon 的 API 来实现负载均衡,默认情况下调用 HttpClient 来调用集群服务。
按照以下顺序启动集群:
启动 zuul-eureka-server(Eureka 服务器)。
启动 zuul-book-service(服务提供者)。
启动 zuul-sale-service(服务调用者)。
启动 zuul-gateway(集群网关)。
在浏览器中访问:http://localhost:8080/sale/sale-book/1,返回“SUCCESS”字符串,在销售模块的控制台,可以看到输出如下:
销售模块处理销售,要销售的图书 id: 1, 书名:Workflow 讲义
根据输出可知,销售模块、书本模块均被调用。本例涉及了 4 个项目,图 7 - 5 展示了本例的结构,可帮助读者理解本例。
图 7 -5 本例的结构
Zuul Http 客户端
我们知道,Ribbon 用来实现负载均衡,Ribbon 在选取了合适的服务器后,再调用 REST 客户端 API 来调用集群服务。在默认情况下,将使用 HttpClient 的 API 来调用集群服务。除了 HttpClient 外,还可以使用 OkHttpClient,以及 com.netflix.niws.client.http.RestClient,RestClient 目前已经不推荐使用,如果想启用 OkHttpClient,可以添加以下配置:ribbon.okhttp.enabled=true。除了该配置外,还要在 pom.xml 中加入 OkHttpClient 的依赖:
dependency
groupId com.squareup.okhttp3 /groupId
artifactId okhttp /artifactId
/dependency
感谢各位的阅读!关于“Spring Cloud 集群怎么使用 Zuul”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!