总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
四、Spring Cloud Netflix 组件开发
上面说到,开发基于Spring Cloud Netflix
的微服务非常简单,而且一般是和spring boot
一起使用,如果想在自己原先的java web
应用中使用也可以通过添加相关配置来实践。 有关开发的详细内容,可以参考spring cloud
中文社区的这个系列文章,里面详细介绍了每一种组件的开发。这里,就只是来看一下服务注册中和监控模块的开发,还有服务调用的开发,其他的可以直接参考上面的系列文章。
4.1 注册和监控中心的开发
这个非常简单,就下面一个类:
import@SpringBootApplication
@EnableEurekaServer
@EnableHystrixDashboard
public class ApplicationRegistry {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
这里使用spring boot
标签的 @SpringBootApplication
说明当前的应用是一个spring boot
应用。这样就可以直接用main函数在IDE里面启动这个应用,也可以打包后用命令行启动。当然也可以把打包的war包用tomcat之类的服务器启动。 使用标签 @EnableEurekaServer
,就能在启动过程中启动Eureka
服务注册中心的组件。它会监听一个端口,默认是8761
,来接收服务注册。并提供一个web页面,打开以后,可以看到注册的服务。 添加 @EnableHystrixDashboard
就会提供一个监控页面,可以在上面输入要监控的服务的地址,就可以查看启用了Hystrix
监控的接口的调用情况。 当然,为了使用上面的组件,需要在maven
的POM
文件里添加相应的依赖,比如使用 spring-boot-starter-parent
,依赖 spring-cloud-starter-eureka-server
和 spring-cloud-starter-hystrix-dashboard
等。
4.2 服务间调用
在网上的各种文档中,对服务间调用,都没有说明的很清楚,所以这里特别说明一下这个如何开发。 有两种方式可以进行服务调用,RestTemplate
和FeignClient
。不管采用何种方式,都是通过REST
接口调用服务的http
接口,参数和结果默认都是通过jackson
序列化和反序列化。因为Spring MVC
的RestController
定义的接口,返回的数据都是通过jackson
序列化成json数据。
4.2.1 RestTemplate
使用这种方式,只需要定义一个RestTemplate
的Bean,设置成 LoadBalanced
即可:
@Configurationpublic class SomeCloudConfiguration {
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
}
这样就可以在需要用的地方注入这个bean使用:
public class SomeServiceClass {
@Autowired
private RestTemplate restTemplate;
public String getUserById(Long userId) {
UserDTO results = restTemplate.getForObject("http://users/getUserDetail/" + userId, UserDTO.class);
return results;
}
}
其中, users 是服务ID,Ribbon
会从服务实例列表获得这个服务的一个实例,发送请求,并获得结果。对象 UserDTO
需要序列号,它的反序列号会自动完成。
4.2.2 FeignClient
除了上面的方式,我们还可以用 FeignClient
。
@FeignClient(value = "users", path = "/users")public interface UserCompositeService {
@RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
UserDTO getUserById(@PathVariable Long id);
}
只需要使用 @FeignClient
定义一个借口,Spring Cloud Feign
会生成一个它的实现,从相应的users服务获取数据。 其中, @FeignClient(value = “users”, path = “/users/getUserDetail”)
里面的value是服务ID,path是这一组接口的path前缀。 在下面的方法定义里,就好像设置Spring MVC
的接口一样,对于这个方法,它对应的URL
是 /users/getUserDetail/{id}
。 然后,在使用它的时候,就像注入一个一般的服务一样注入后使用即可:
public class SomeOtherServiceClass {
@Autowired
private UserCompositeService userService;
public void doSomething() {
// .....
UserDTO results = userService.getUserById(userId);
// other operation...
}
}
五、遇到的问题
由于Spring Cloud
说明文档较少,微服务的架构相对来说也比较复杂,在开发的时候,难免会遇到很多问题,有一些是如何更好地使用这套框架去搭建架构,也有一些问题是如何配置。
5.1 请求超时问题
ZUUL
网关默认的超时时间非常短,这是为了保证调用服务的时候能够很快的响应。但是,会有一些业务方法运行的时间比较长,特别是在测试服务器。这时候,就需要调整超时时间。这个超时有几个地方:
- 负载均衡
Ribbon
,负载均衡有一个超时的设置,包括链接时间和读取时间 Hystrix
断路器也有一个超时设置,它需要在适当的时候返回,而不是一直等在一个请求上。
对应的配置如下:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 30000
ribbon:
ReadTimeout: 30000
ConnectTimeout: 15000
5.2 服务ID的问题
服务的ID,也就是服务名,可以通过在application.yml
或者bootstrap.yml
里面设置:
spring:
application:
name: users
5.3 管理路径的问题
Spring Boot
的应用默认都是开放一些管理的接口,如 /info 、 /health 和metrics监控的接口 /metrics 等。如果使用默认的路径,使用Hystrix
监控、服务注册中心的监听服务状态都不会有问题,但是,如果想使用别的路径,例如 /management/info 、 /management/health ,那就牵扯到很多地方,而且,每个版本可能会或多或少的有一些问题,导致你遇到的问题还会不一样。我遇到过的问题有:
5.3.1 注册成功却找不到服务
首先,注册可以成功,在Eureka
服务器页面上也可以看到各个服务。但是,当通过网关调用的时候,却总是提示服务找不到。这时候可能就需要在每个服务的application.yml
里面进行如下配置:
eureka:
instance:
nonSecurePort: ${server.port}
appname: ${spring.application.name}
statusPageUrlPath: ${management.context-path}/info
healthCheckUrlPath: ${management.context-path}/health
简单来说,这就是告诉在注册的时候,同时告诉Eureka
服务器,服务的端口是什么,用来监听状态的路径是什么。这是因为由于使用了不同的管理接口路径,而Eureka
服务器没有使用相应的路径。 如果一切正常,在Eureka
服务器上点击一个注册的服务,应该能打开一个info页面。他可能是空白的,但是,至少Eureka
服务器能通过这个知道服务的运行正常。 这个问题也不是在所有的版本都存在,只是在某一些spring cloud
的版本存在。
5.3.2 设置了管理路径的Hystrix监控
刚才说了Hystrix
监控的路径是 http://serviceIp:port/hystrix.stream
,如果设置了管理接口的路径,那么这个监控路径也会变成http://serviceIp:port/${management.context-path}/hystrix.stream
。如果这时候,再想使用Turbine
聚合,Turbine
就会找不到了,因为它默认使用Eureka服务器上的服务器地址和端口,在后面添加/hystrix.stream
。这时候,就需要设置
Turbine:
turbine:
aggregator:
clusterConfig: USER
appConfig: USER
instanceUrlSuffix:
USER: /user/hystrix.stream
5.3.3 管理路径的安全性
对于微服务部署的几台机器,可以通过开通防火墙来控制谁可以访问管理接口,但是,即使是这样,为了安全性等,一般还是会把管理端接口也用spring security
来保护。这样一来,监控接口就没法直接访问了。
5.4 服务间调用的权限验证
一般API
接口都需要某种授权才能访问,登陆成功以后,然后通过token
或者cookie
等方式才能调用接口。 使用Spring Cloud Netfix
框架的话,登录的时候,把登录请求转发到相应的用户服务上,登陆成功后,会设置cookie
或header token
等。然后客户端接下来的请求就会带着这些验证信息,从ZUUL
网关传到相应的服务上进行验证。
ZUUL
网关在把请求转发到后台的服务的时候,会默认把一些header
传到服务端,如:Cookie, Set-Cookie, Authorization
。这样,客户端请求的相关headers
就可以传递到服务端,服务端设置的cookie
也可以传到客户端。 但是,如果想禁止某些header
透传到服务端,可以在ZUUL
网关的application.yml
配置里通过下面的方式禁用:
zuul:
routes:
users:
path: /users/\*\*
sensitiveHeaders: Cookie,Set-Cookie,Authorization
serviceId: user
最后
金三银四到了,送上一个小福利!
M7iJ8cq-1715541634012)]