1.实验目的
了解Spring Cloud的概念和特点
掌握Spring Cloud Eureka的使用
掌握Spring Cloud Ribbon的使用
2.实验环境 已经搭建好的java环境
实验内容即完成情况 4.1 :1.搭建Maven父工程
在Eclipse中,创建一个Maven父工程microservice-springcloud,并在工程的pom.xml文件中添加Spring Cloud的版本依赖等信息。
修改pom.xml文件
1.搭建服务端工程
在父工程microservice-springcloud中,创建Maven模块microservice-eureka-server作为服务端工程
(1)添加依赖。在pom.xml文件中添加Eureka Server的依赖
(2)编写配置文件。在配置文件中增加端口号等配置信息。
注册中心地址可以写为 http://localhost:8761/eureka/
上述代码中,首先配置了端口号为8761,所有服务的实例都需要向此端口注册。接下来配置实例名为localhost,由于本项目是一个注册中心,是不需要向自己注册和检索服务的,所以register-with-eureka和fetch-registry都需要设置为false.最后defaultZone中的地址是注册中心的地址。
(3)修改服务端java代码。在项目的引导类上添加注解@EnableEurekaServer,该注解用于声明标注类是一个Eureka Server,
(4)启动应用,查看信息。完成上述配置后,启动应用程序并在浏览器中访问地址http://localhost:8761/即可看到Eureka的信息面板
2.搭建客户端工程
在父工程microservice-springcloud中,创建maven子模块microservice-eureka-user作为客户端工程,该模块也是一个基础的Spring boot工程,其主要代码的实现过程如下。
(1)添加依赖。在pom.xml文件中添加依赖Eureka依赖
(2)编写配置文件。在配置文件中添加Eureka服务实例的端口号、服务端地址等信息
(3)修改客户端java代码。在项目的引导类上添加注解@EnableEurekaClient,该注解用于声明标注类是一个Eureka客户端组件
(4)启动应用,查看信息。完成上述配置后,分别启动服务端工程和客户端工程,在浏览器访问地址http://localhost:8761/后,我们可以看从Eureka的信息面板中看到注册的服务信息。
从上图中可以看到,服务已经成功注册到了注册中心,注册后的服务就可以被其他服务调用了。
需要注意的是,在本地调试基于Eureka的程序时,可能会在注册信息页面中出现红色警告信息
出现有关这样的警告信息EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMINGS 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 Server的自我保护机制。该机制会使注册中心所维护的实例不是很准确,所以本地开发时,可以在Eureka Server应用的配置文件中使用eureka.server.enable-self-preservation=false参数来关闭保护机制,以确保注册中心可以将不可用的实例正确删除。
4.2如何实现服务间的调用?
1.搭建订单服务工程
在父工程microservice-springcloud中,创建Maven子模块microservice-eureka-order,其主要代码的实现过程如下:
(1)在pom.xml中,添加spring-cloud-starter-eureka依赖
(2)编写配置文件。在配置文件中添加Eureka服务实例的端口号、服务端地址等信息
(3)编写启动类
(4)创建订单实体类。创建com.itheima.springcloud.po包,并在包中创建订单实体类Order
(5)创建订单控制器类。创建com.itheima.springcloud.controller包,并在包中创建订单控制器类OrderController。在该类中模拟编写一个通过id查询订单的方法。
(6)在引导类中添加@EnableEurekaClient注解。
2.编写用户服务功能
(1)在microservice-eureka-user工程的引导类中,创建RestTemplate的Spring实例,其代码如下
在上述代码中,RestTemplate是Spring提供用于访问Rest服务的客户端实例,它提供了多种便捷访问的远程Http服务的方法,能够大大提高客户端的编写效率。
(2)创建用户控制器类,并在类中编写查询方法
3.启动服务应用,测试服务调用
分别启动服务注册中心应用、订单服务应用和用户服务应用,此时Eureka信息页面的显示信息如图:
当通过浏览器访问地址http://localhost:8000/findOrdersByUser/1(1表示用户id)后,浏览器的显示效果如图:
通过访问用户服务,已经成功查询到了与用户相关的订单信息。
4.3 客户端负载均衡
在Eureka中使用Ribbon十分简单,只需要在实例化RestTemplate的方法上添加@LoadBalanced注解,并在其执行方法中使用服务实例的名称即可。具体实现过程如下:
(1)添加@LoadBalanced注解。在microservice-eureka-user工程的引导类中的restTemplate()方法上添加@LoadBalanced注解,其代码如下:
在上述代码中,RestTemplate被@LoadBalanced注解后,就具有了负载均衡的能力。
(2)使用服务实例名称。在用户服务实例的查询方法中,使用服务提供者(订单服务)的实例名称来执行已注册服务列表中实例的方法。
从上述代码中可以看出 ,getForObject()方法中的URL中使用的已经不是“主机地址+端口号”的形式,而使用的是注册中心中的订单服务实例名称。
(3)创建监听器类。为了演示负载均衡的实现效果,这里在microservice-eureka-order工程中创建一个用于监听服务实例端口的工具类ServiceInfoUtil,其实现代码如下。
上述工具类实现了ApplicationListener接口,该接口在Spring3.0中添加了泛型来声明所需要监听的事件类型,其中EmbeddedServletContainerInitializedEvent主要用于获取运行服务器的本地端口号。
(4)添加输出语句。在订单控制器类OrderController的查询订单方法中,增加一行执行输出当前实例端口号的语句。具体如下:
(5)启动服务,测试应用。分别启动注册中心、用户服务和订单服务,然后修改订单服务的端口号(如7901),再次启动一个订单服务后,Eureka信息页面的注册信息如图所示:
当通过浏览器连续4次访问地址http://localhost:8000/findOrdersByUser/1后,两个应用的Eclipse控制台的输出结果如图:
在浏览器连续访问4次后,用户服务实例通过Ribbon分别调用了2次端口为7900和7901的订单服务实例,这说明已成功通过Ribbon实现了客户端的负载均衡。其实Ribbon在工作主要分为两步:第一步先选择Eureka Server,它会优先选择在同一个区域且负载较少的Server;第二步会根据用户指定的策略(如轮询、随机等)从Server取到的注册服务列表中选择一个地址。本案例中,Ribbon所使用的策略就是轮询。
总结
未完待续!多多点赞转发哦!如果有更好的学习心得欢迎留言评论
来者不拒 …