Java SpringCloud

Nacos注册中心安装

单机模式、集群模式、多集群模式

安装JDK8配置JAVA_HOME

下载Nacos

https://github.com/alibaba/nacos/releases

启动nacos

windows cmd执行:startup.cmd -m standalone 或者 .\startup.cmd -m standalone
linux 执行:startup.sh -m standalone

windows下删除startup.cmd下面语句不然会报错

1
-XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages

访问

输入 localhost:8848/nacos 用户名和密码 都是 nacos

nacos配置存储在MYSQL数据库中

数据库执行conf/mysql.sql,建立配置表
修改conf/application.properties,找到位置,放开相关注释,修改数据库连接信息

1
2
3
4
5
6
7
8
9
10
11
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/it-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=abc
db.password.0=Abc@defg123

Gateway

配置

system/**开头的路径会转发给provider服务。

1
2
3
4
5
6
7
8
server.port=8888
spring.application.name=service-gateway
spring.cloud.nacos.discovery.server-addr=http://127.0.0.1:8848

spring.cloud.gateway.routes[0].id=route0
spring.cloud.gateway.routes[0].uri=lb://service-provider
spring.cloud.gateway.routes[0].predicates[0]=Path=/system/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cloud:
gateway:
discovery:
locator:
# 是否和服务注册与发现组件结合,设置为 true 后可以直接使用应用名称调用服务
enabled: true
# 路由(routes:路由,它由唯一标识(ID)、目标服务地址(uri)、一组断言(predicates)和一组过滤器组成(filters)。filters 不是必需参数。)
routes:
# 路由标识(id:标识,具有唯一性) 截取请求
- id: route0
# 目标服务地址(uri:地址,请求转发后的地址)
uri: https://www.infotech.vip
# 路由条件(predicates:断言,匹配 HTTP 请求内容)
predicates:
## 转发地址格式为 uri/archive,/system 部分会被下面的过滤器给截取掉
- Path=/system/user
filters:
## 截取路径位数
- StripPrefix=1

代码主要内容

  • 权限过滤:定义filter校验token与通过策略放行部分路径进行权限过滤控制
  • 服务降级:Sentinel返回错误信息
  • 跨域控制

Open Feign Client

简单测试定义springclouddemo-provider springclouddemo-consumer springclouddemo-gateway三个微服务根据需要增加项目前缀容易识别,一般是项目名称,比如springclouddemo-,正常业务是一个服务可以同时是服务消费者与服务提供者,服务命名需要根据具体需求定义。

maven依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

demo

消费者微服务定义调用其他微服务服务的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package vip.infotech.springclouddemoconsumer.feignclient;

/**
* 调用service-provider中的test接口
*/
@FeignClient(name="service-provider")
public interface TestProviderFeign {

@RequestMapping("test")
public String test();

@RequestMapping("update")
public String updateUserName(Integer id, Stirng userName);

}

消费者微服务业务实现调用TestService的test

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package vip.infotech.springclouddemoconsumer.service.impl;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserMapper userMapper;

@Autowired
private TestProviderFeign testProviderFeign;

@Override
@GlobalTransactional(rollbackFor = Exception.class)
// @Transactional(rollbackFor = Exception.class)
public boolean updateUserAge(Integer id, Integer age) {

// 通过当前服务修改数据
testUserMapper.updateUserAge(id, age);

// 通过 fegin 调用其他服务修改数据
testProviderFeign.updateUserName(id, "abc");

// 两个都执行成功时,这里发生异常,测试是否数据都会回滚
System.out.println(1/0);

return true;
}
}

服务提供者微服务Controler层定义updateUserAgetest提供其他服务调用。

feign配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 设置 feign 客户端超时时间, 默认 1s
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
compression:
request:
# 开启数据压缩请求
enabled: true
# 压缩数据类型
mime-types: text/xml, application/xml, application/json
# 数据压缩下限 2048表示传输数据大于2048 才会进行数据压缩(最小压缩值标准)
min-request-size: 2048
# 开启数据压缩响应
response:
enabled: true

# OpenFeign 默认支持 Ribbon,也可以使用以下配置
ribbon:
# 建立连接所用时间,适用于网络正常的情况下,两端连接所用的时间
ConnectTimeout: 5000
# 建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 5000

日志

1
2
3
4
5
6
7
@Configuration
public class LogConfig {
@Bean
Logger.Level loggerLevel(){
return Logger.Level.FULL;
}
}
1
2
3
4
logging:
level:
# 以什么级别监控那个接口
com.software.controller: debug