本文选自孙卫琴的《精通Spring:Java Web开发技术详解》清华大学出版社出版
技术支持网址为: www.javathinker.net/spring.jsp
本书对应的直播和录播课: www.javathinker.net/zhibo.jsp
孙卫琴的QQ学习答疑群:915851077
本文将创建一个包含微服务的servicemodule模块,并且把当前模块注册到Eureka服务器中。
如图1所示,servicemodule模块包含以下内容:
- Tomcat服务器:监听8088端口,是运行ServiceController类的Web容器。
- ServiceController类:采用RESTFul风格的控制器类,它的getWeather()方法提供天气预报的微服务。
- EurekaClient插件:负责和Eureka服务器通信,把当前模块注册到Eureka服务器中。并且会每隔一段时间就自动从Eureka服务器获取最新的微服务模块注册列表,把它保存在自身的缓存中。
- ServicemoduleApplication启动类:启动Tomcat服务器,并且启用EurekaClient插件。
图1 servicemodule模块的结构
在Filter窗口中选择“Web”-->“Spring Web”功能,以及“Spring Cloud Discovery”-->“Eureka Discovery Client”功能,参见图2和图3。Spring Assistant会依据这个选择为应用程序提供所依赖的类库,使得当前模块会支持Spring MVC框架,并且会包含EurekaClient插件。
Spring Assistant会依据这个选择为应用程序提供所依赖的类库,使得当前模块会支持SpringMVC 框架,并且会包含EurekaClient插件。
图2 选择“Web”--> “Spring Web”功能
图3 选择“Spring Cloud Discovery”-->“Eureka Discovery Client”功能
1. 创建ServicemoduleApplication启动类
servicemodule模块创建好以后,SpringBoot工具会自动创建一个ServicemoduleApplication启动类,在这个类中增加@EnableEurekaClient注解,参见例程1。@EnableEurekaClient注解的作用是启用EurekaClient插件。本模块会通过EurekaClient插件向Eureka服务器注册自身。
例程1 ServicemoduleApplication.java
@SpringBootApplication
@EnableEurekaClient
public class ServicemoduleApplication {
publicstatic void main(String[] args) {
SpringApplication.run(ServicemoduleApplication.class, args);
}
}
2. 创建微服务入口ServiceController控制器类
ServiceController类是一个普通的采用RESTFul风格的控制器类,它的getWeather()方法能提供天气预报的微服务,参见例程2。
例程2 ServiceController.java
@RestController
public class ServiceController {
@RequestMapping("weather/{date}")
publicString getWeather(@PathVariable("date")String date){
returndate+"
日的天气:"+"
晴转多云,阵风3级";
}
}
以上普通的ServiceController控制器类置身于Spring Cloud庞大的框架中,就变成了微服务的入口。之所以称它是微服务入口,而不是微服务的实现类,这是因为在实际的应用程序中,控制器类往往是通过调用模型层的方法来提供具体的业务逻辑服务。本范例只不过是做了简化,直接由ServiceController控制器类的getWeather()方法来提供微服务。
到此为止,神秘抽象的微服务又进一步被揭开了面纱,原来它的入口不过是大家熟悉的Spring MVC框架中的控制器类。
3. 配置servicemodule模块
在C:cloudappservicemodulesrcmainresources目录中创建Spring的配置文件application.yml。以下例程3是application.yml的源代码。
例程3 application.yml
server:
port: 8088
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8001/eureka/
instance:
#间隔多长时间发送心跳给Eureka服务器,表明当前模块仍然活着,默认30秒
lease-renewal-interval-in-seconds: 5
#Eureka服务器在接收到当前模块最后一次发出的心跳后,
#需要过多久才能认定当前模块已经无效
lease-expiration-duration-in-seconds: 10
spring:
application:
name:WEATHER-SERVICE
以上配置文件指定当前模块的Tomcat服务器监听8088端口。EurekaClient插件所访问的Eureka服务器的地址为“http://localhost:8001/eureka/”。 EurekaClient插件向Eureka服务器注册当前模块时,把注册名字设为“WEATHER-SERVICE”。
EurekaClient插件向Eureka服务器注册了当前模块后,万一当前模块在运行中异常终止了,Eureka服务器如何能监测到这一情况呢?解决办法是由EurekaClient插件定时向Eureka服务器发送一个表明当前模块还活着的信息,可以把这个信息形象地称为“心跳”。以上配置文件中的lease-renewal-interval-in-seconds属性就用来设定发送心跳的间隔时间,以秒为单位。
假如EurekaClient插件间隔5秒发送一次心跳,后来当前模块终止运行了,Eureka服务器再也没接收到当前模块的心跳。从最后一次接收到当前模块的心跳的时刻开始,超过了lease-expiration-duration-in-seconds属性所设置的时间(以秒为单位)后,Eureka服务器就可以认定当前模块已经无效。
4. 运行servicemodule模块
先运行eurekamodule模块,然后在IDEA中运行ServicemoduleApplication启动类,就会运行servicemodule模块。ServicemoduleApplication启动类会启动监听8088端口的Tomcat服务器,并且还会启用EurekaClient插件,它把当前模块注册到Eureka服务器中。
通过浏览器访问:
http://localhost:8001
就会返回Eureka服务器的主页,参见图4,此时会看到在Eureka服务器中已经注册了一个名为“WEATHER-SERVICE”的应用实例,实际上就是指servicemodule模块。
图4 Eureka服务器的主页
通过浏览器访问:
http://localhost:8088/weather/2020-10-02
就会按照普通的访问RESTFul风格的控制器类的方式,来访问ServiceController类的getWeather()方法,在网页上会展示getWeather()方法的返回结果,参见图5。
图5 访问ServiceController类的getWeather()方法



