spring cloud Alibaba | Spring cloud Netflix | Spring Cloud官方 | Spring Cloud Zookeeper | Spring Cloud Consul | Spring Cloud Kubernetes | |||||
---|---|---|---|---|---|---|---|---|---|---|
分布式配置 | Nacos Config | Archaius | Spring Cloud Config | Zookeeper | Consul | ConfigMap | ||||
服务注册/发现 | Nacos Discovery | Eureka | Zookeeper | Consul | API Server | |||||
服务熔断 | Sentinel(哨兵) | Hystrix | ||||||||
服务调用 | Dubbo RPC | Fegin | OpenFeign RestTemplate | |||||||
服务路由 | Dubbo+Servlet | Zuul | Spring Cloud Gateway | |||||||
分布式消息 | SCS RockMQ Binder | SCS RabbitMQ Binder | SCS Consul Binder | |||||||
消息总线 | RockMQ Bus | Consul Bus | ||||||||
负载均衡 | Dubbo loadBalance | Ribbon | ||||||||
分布式事务 | Seata | |||||||||
Sidecar | Spring Cloud Alibaba Sidecar | Spring Cloud Netflix Sidecar |
注意springcloudalibaba 和springboot有版本对应关系
Nacos注册中心
nacos是注册中心+配置中心+服务管理平台
1.服务发现和服务健康检测
2.动态配置服务
3.动态DNS服务
4.服务及其元数据管理
管理所有微服务、解决微服务之间调用关系
安装nacos
1.注意springcloudalibaba和nacos版本对应
2.nacos\bin修改startup文件
set MODE="standalone"#是单机
set MODE="cluster"#是集群
3.修改nacos\conf\application.properties文件(路径,端口,数据源等配置)
server.servlet.contextPath=/nacos
server.port=8848
4.执行startup运行nacos,如果没反应就是没有找到 String "JAVA_HOME"或者是java.exe文件
springcloud中配置nacos
1.springcloud父pom中加入nacos模块
<modules>
<module>order-nacos</module>
<module>stock-nacos</module>
</modules>
2.在服务pom中添加依赖
<!--服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.配置服务 yml
server:
port: 8020 #服务端口
spring:
application:
name: order-server #服务名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos server端地址
discovery:
username: nacos #nacos server用户名
password: nacos #nacos server密码
namespace: public #命名空间 public、dev、test
4.版本低的需要在启动类上加注解@EnableDiscoveryClient,高版本不需要
5.启动服务,要先运行nacos服务,在启动其他服务到nacos上注册
2022-04-26 18:19:52.630 INFO 9316 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP order-server 192.168.0.105:8020 register finished
2022-04-26 18:19:53.127 INFO 9316 --- [ main] com.hot.order.OrderApplication : Started OrderApplication in 5.918 seconds (JVM running for 7.75)
6.注意。nacos只是注册和发现服务等配置,服务间远程调用是需要ribbon负载均衡调用,官方移除了Robbion,Spring Cloud Loadbalancer 是新的官方推荐的负载均衡器。否则会报错unknow找不到。
调用方需要加入负载均衡器
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
RestTemplate restTemplate = restTemplateBuilder.build();
return restTemplate;
}
Nacos集群搭建
1.application.properties里配置IP,port和mysql
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
2.在mysql中创建数据库,要和刚配置的名字一致(nacos),执行sql脚本文件nacos-mysql.sql
3.cluster.conf.example文件复制一份去掉.example修改集群IP和port
192.168.16.101:8847
192.168.16.102:8847
192.168.16.103:8847
4.编辑startup文件
set MODE="cluster"#是集群
#修改jvm内存大小,默认太大2G
rem if nacos startup mode is cluster
if %MODE% == "cluster" (
echo "nacos is starting with cluster"
if %EMBEDDED_STORAGE% == "embedded" (
set "NACOS_OPTS=-DembeddedStorage=true"
)
set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
)
5.安装nginx
6.修改nignx.conf文件
将3个服务注册到nginx上
7.将微服务里的application.yml Nacos server-addr ip:port 都改成nginx服务器 上图中的8847
Ribbon负载均衡
客户端负载均衡(服务消费端调用),可配置超时,重试等。通过loadBalance获取到服务提供的所有机器实例
,ribbon自动基于某种策略调取服务(轮询,随机,自定义)
修改负载均衡策略有两种方式
1.配置类
复制一份消费端服务,修改名称为order-ribbon,删除order-ribbon.iml文件
<artifactId>order-ribbon</artifactId>
cloud的pom文件里加入order-ribbon模块(因为手动复制的服务,需要手动加入模块)
<module>order-ribbon</module>
2.配置文件
LoadBalancer负载均衡器
spring cloud 官方的负载均衡器
<!--nacos服务注册与发现 移除ribbon支持-->
<!--服务注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--移除ribbon支持-->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
nacos-discovery中引人了ribbon,需要移除ribbon的包,也可以从yml中禁用ribbon
spring:
application:
name: order-ribbon #服务名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 #nacos server端地址
discovery:
username: nacos #nacos server用户名
password: nacos #nacos server密码
namespace: public #命名空间 public、dev、test
loadbalancer: #禁用ribbon
ribbon:
enabled: false
Feign
模板化的HTTP客户端远程调用
spring cloud alibaba叫OpenFign
1.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-start-openfeign</artifactId>
</dependency>
2.启动类加注解
@EnableFeignClients
public class OrderApplication{
psvm...
}
3.添加接口和方法,要和远程端的一一对应
//name:调用的服务名,path:调用的controller请求路径
@FeignClient(name="stock-service",path="/stock")
public interface StockFeignService{
//调用对应的方法
@RequestMapping("/reduct")
public String reduct();
}
4.注入接口,调用远程服务
@Autowired
StockFeignService stockFeignService;
5.Feign日志
全局日志:所有的服务提供方
@Configuration
public class FeignConfig{
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;//枚举类型
}
}
yml中修改日志级别
因为spring boot默认的日志级别是info,>feign的debug级别
logging:
level:
包路径: debug
局部日志
方式一
去掉@Configuration,在服务提供方在FignClient注解中追加参数,configuration = FeignConfig.class
方式二
yml中配置
feign:
client:
config:
product-service: #服务名
loggerLevel: FULL
connectTimeout: 5000 #链接超时默认2s
readTimeout: 3000 #请求处理超时默认5s
拦截器日志
实现RequestInterceptor接口重写apply()
yml中设置拦截器生效
connectTimeout: 5000 #链接超时默认2s
readTimeout: 3000 #请求处理超时默认5s
requestInterceptors[0]
拦截器全路径