文章目录
Spring Cloud默认集成微服务集群的解决方案,它提供了非常全面的组件来供开发者使用。它吸收了Spring Boot的优越特性,仅需要一些简单的配置即可构建可弹性扩展的微服务集群。开发者不需要再过度的去关注复杂的配置和实现原理。
Eureka
创建Eureka服务端
- 配置Eureka服务端信息
- 其他的一些常用配置
eureka.instance.hostname
修改当前主机名称。在后续的高可用中需要用到
eureka.instance.appname
修改当前实例名称。实例名称用作在监控页面显示
eureka.client.registerWithEureka(或eureka.client.register-with-eureka)
是否注册自身到Eureka服务器。如果是单台且当前应用本身就是服务器,则可以把值设置为false
eureka.client.fetchRegistry(或eureka.client.fetch-registry)
是否从Eureka服务器获取注册信息。如果是单台且当前应用就是服务器,则可以把值设置为false
spring.application.name
声明当前应用名称,可作为监控网页的显示
- 为当前项目添加服务端声明注解
访问Eureka服务监控网页
- localhost:8761
创建Eureka客户端
- 配置Eureka客户端信息
- 将应用声明为客户端
创建高可用Eureka服务端
假设我们有三台Eureka服务器,那么我们只需要将这三台服务器的注册中心地址填对方即可完成两两注册。为了方便测试,我们使用在同一个项目中采用多段配置的方式。
- 集群配置文件
eureka:
instance:
appname: server
server:
#关闭自我保护
enable-self-preservation: false
#设置超时节点清理的间隔时间
eviction-interval-timer-in-ms: 10000
---
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8762/eureka,http://127.0.0.1:8763/eureka
server:
port: 8761
spring:
profiles: eurekaS1
---
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka,http://127.0.0.1:8763/eureka
server:
port: 8762
spring:
profiles: eurekaS2
---
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8762/eureka,http://127.0.0.1:8761/eureka
server:
port: 8763
spring:
profiles: eurekaS3
- —表示多段配置,配置的应用可以在启动服务时启用(–spring.profiles.active=profiles的值。 如–spring.profiles.active=eurekaS1)。
在高可用环境中客户端的配置
- 在服务端高可用的情况下,客户端需要同时指向多台服务器,保证高可用性,避免某台节点故障之后导致不可访问的情况。
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
spring:
application:
name: orderclient
Eureka、Consol、Nacos比较
OpenFeign
Spring Cloud OpenFeign 基于Netflix Feign 实现的,并且实现了声明式的Web服务客户端定义方式,它使得web服务客户端更容易编写。为了更方便的与Spring 组件集成,Spring Cloud还为OpenFeign提供了SpringMVC的支持。当它配合Eureka和Ribbon可以很方便的实现客户端负载均衡。
引入OpenFeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建接口client端
- 在SpringBoot的启动类上加入@EnableFeignClients注解即可完成OpenFeign的使用声明。
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderSystemApplication {
public static void main(String[] args) {
SpringApplication.run(OrderSystemApplication.class, args);
}
}
使用测试
- 被调用模块的handler
@RestController
public class UserHandler {
@GetMapping("query/{uid}")
public UserModel query(@PathVariable Integer uid){
UserModel userModel = new UserModel();
userModel.setUid(uid);
userModel.setUname();
return userModel;
}
}
- 调用模块创建一个接口
@FeignClient("userclient") // 对应yml配置文件中被调用模块的application name,name不允许出现特殊字符
public interface UserClient {
@GetMapping("query/{uid}")
UserModel getUserInfo(@PathVariable("uid") Integer uid);
}
- 调用模块像使用接口一样进行调用
@RestController
public class OrderHandler {
@Resource
private UserClient userClient;
@GetMapping("query/feign/{oid}/{uid}")
public OrderModel query(@PathVariable Integer oid, @PathVariable Integer uid){
UserModel userModel = userClient.getUserInfo(uid);
OrderModel orderModel = new OrderModel();
orderModel.setOid(oid);
orderModel.setUserModel(userModel);
return orderModel;
}
}
OpenFeign的基本配置
- OpenFeign的基本配置信息在FeignClientProperties类中,所有的配置都是基于config的成员变量进行设置。具体可配置属性可参考FeignClientProperties类中的内部类FeignClientConfiguration中的成员属性。
- 超时配置建议在所有OpenFeign中进行配置。
微服务中的公共类
- 在微服务中,每一个服务都是单独存在的个体,各自治理。虽然是独立的个体,但是多多少少还会有一些对应的交集,比如实体类和各种工具类。
创建公共模块
- common模块由于只负责管理公共类,并不需要容器和启动类,所以当前模块是使用maven创建的Java项目。
common 的pom文件
- 跟其他服务的pom一样,需要指向共同的父级,并指定当前的artifactId。
父级pom文件
- 在父级pom文件中同样需要将common加入到当前项目的子模块。同时为了方便下属其他子模块的引用,需要将common加入到公共依赖中。
打包公共模块
配置完所有的信息之后,只需要将公共模块打包即可在其他项目中引用。
Ribbon
- Ribbon是一个客户端负载均衡器,在Feign中实际上也默认使用了Ribbon来做负载,且该功能是默认启用的。客户端负载实际上跟Nginx类似,都是将访问请求转发到其他服务器。它通过Eureka注册中心的Application名称来获取服务器列表,然后在调用时通过负载策略来访问具体的服务器地址。
- OpenFeign默认集成Ribbon,不需要额外的环境要求。
Ribbon的负载策略
- 配置负载策略也比较简单,只需要在yml中声明负载需要引用的类即可。
USERSERVICE:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
- USERSERVICE是指在FeignClient中连接的服务名,负载策略是按照服务名单独来进行配置的。