Spring Cloud Alibaba微服务框架
搬砖使用的是阿里的微服务框架,估计是Eureka后续不更新了,阿里的微服务框架发展势头更猛,现在趁有时间总结下。先使用,后续研究记录下原理等等。
一、nacos
实现分布式环境下的配置管理和服务注册发现,感觉是以前的Eureka与Config结合。
1、 安装(windows下)
Nacos:微服务配置中心、服务注册中心
环境要求:基础环境:JDK 1.8+;Maven 3.2.x+
Nacos版本:官方推荐稳定1.1.4版本
下载地址:https://github.com/alibaba/nacos/releases
文件 nacos-server-1.1.4.zip
2、 启动
解压后进入nacos\bin目录下双击startup.cmd启动,浏览器访问页面http://127.0.0.1:8848/nacos/index.html ,用户名密码皆为nacos,查看配置与注册的服务
二、使用步骤
1.实现配置管理
(1)引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
(2)在配置文件application.properties中配置nacos server的地址与应用名称,也可以是yml文件
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=example
(3)在程序中使用@RefreshScope注解实现配置自动更新
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
/**
* http://localhost:8080/config/get
*/
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
(4) 启动spring boot应用,调用接口http://localhost:8080/config/get,返回false
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
在管理页面更新配置并发布,重新调用接口http://localhost:8080/config/get,返回true,程序中useLocalCache动态更新了
2.服务注册发现功能
nacos+openFeign 实现服务注册、服务调用
(1)依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
(2)配置服务提供者service provider,服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server 上。
配置文件配置端口、服务名、nacos server服务端口
server.port=8090
spring.application.name=service-provider2
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
通过注解 @EnableDiscoveryClient 开启服务注册发现功能
(3)配置服务消费者service consumer,服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
消费者工程中配置端口、应用名、nacos server 地址
server.port=9529
spring.application.name=service-openfeign
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
通过注解 @EnableDiscoveryClient 开启服务注册发现功能,@FeignClient注解指定调用的服务名,@EnableFeignClients注解开启OpenFeign,可以直接使用remoteClient实例调用RemoteClient接口中的方法,RemoteClient可以继承服务提供者的接口。如果 Feign 接口定义跟启动类不在同一个包名下,还需要制定扫描的包名 @EnableFeignClients(basePackages=“com.fangjia.api.client”)
**大致原理是通过name在注册中心找到应用,获取name与ip、端口等信息。openFeign 实现了Ribbon负载均衡,所以会选择某台机器拼接url地址调用接口。**这里还能指定fallback,进行熔断或降级处理,后续记录下。
启动类
(4)分别启动 服务消费者和 服务提供者应用 ,调用 http://localhost:9529/feign,返回内容为 你好,nacos!。
启动日志中可以看到服务已经注册成功
o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, service-openfeign 192.168.0.101:9529 register finished
o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, service-provider2 192.168.0.101:8090 register finished
Nacos server可以看到注册的服务
3.路由转发
nacos+gateway
(1)引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意与springboot的依赖可能会有冲突,需要避免引入 spring-boot-starter-web 与spring-boot-starter-tomcat,否则启动失败
(2)gateway支持在配置文件application.properties中配置路由转发地址,也支持在代码中路由转发。
新建工程端口为18085,routeLocator是进行路由转发的方法,可以返回多个路由路径,routes表示多个路由,由route定义单个路由,path定义访问地址,真实访问时filters过滤
掉v1,仅调用**所指内容,url指向调用的服务地址,可配置为域名等。
application.properties
server.port=18085
spring.application.name=nacos-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r->r.path("/v1/**")
.filters(f->f.stripPrefix(1))
.uri("http://localhost:8090"))
.route(r->r.path("/v2/**")
.filters(f->f.stripPrefix(1))
.uri("http://localhost:9529"))
.build();
}
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
启动上一步服务注册发现建好的两个工程,nacos-gateway,nacos-openFeign以及nacos-provider2
顺便说一下,这些工程都能从nacos官网下载下来学习修改。
调用接口,访问nacos-gateway提供的地址localhost:18085/v1,实际访问的是localhost:8090,实现了路由转发,项目里可以通过nginx转发至gateway,再通过gateway转发地址。
基于配置文件的路由配置:
spring:
cloud:
gateway:
routes:
- id: qq_route
uri: http://qq.com
order: 2
predicates:
- Path=/qq
filters:
- AddResponseHeader=hello, Gateway
补一个官网地址:https://github.com/alibaba/nacos