微服务理念
它是一种设计风格,目的是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间一般通过HTTP的RESTfUL API进行通信写作。
restful风格
数据的增删改查,使用http的不同方式,数据传输用json
查询:GET 新增:POST 修改:PUT 删除:DELETE
RestTemplate完成远程调用
Spring提供一种简单的模板类,用于访问restful服务与HttpClient类似
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Nacos注册中心
nacos启动
./startup.sh -m standalone #非集群模式启动
在nacos中注册后
这两个服务对外暴露restful接口,用户调用消费者,消费者从注册中心发现得到生产者的服务信息(IP和端口号),通过RestTemplate调用生产者返回数据
演示例子
consumer消费者 controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
//访问Rest服务的客户端
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable("id")Integer id){
//获取nacos中注册的所有服务信息
List<String> services = discoveryClient.getServices();
for (String service : services) {
System.out.println(service);
}
//获取nacos中注册的指定服务信息
ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-provider").get(0);
String service1=serviceInstance.getHost()+":"+serviceInstance.getPort();
String url="http://"+service1+"/provider/getUserById/"+id;
return restTemplate.getForObject(url,User.class);
}
}
ConfigBean
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class);
}
}
application.yml
server:
port: 8080
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.112.130 #nacos服务的地址
application:
name: nacos-consumer
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
provider生产者 controller
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
application.yml
server:
port: 8080
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.112.130 #nacos服务的地址
application:
name: nacos-consumer
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
测试
http://localhost:8080/consumer/getUserById/1
如图,消费者发送请求成功响应数据
Nacos配置中心
配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。
配置中心的思路就是
- 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
- 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
- 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
Nacos配置隔离
通过namespace,group,dataid定位到一个配置集,
nacos实现配置管理和动态配置刷新
1.添加对应的spring-cloud-starter-alibaba-nacos-config依赖
2.使用注解@Value导入配置
3.使用@RefreshScope刷新配置
4.根据自己的业务场景做好多环境配置隔离(Namespace)不同业务配置隔离(Group)
5.命名空间和分组的配置一定要放在bootstrap.yml或者bootstrap.properties配置文件中
- Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
- Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
- DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
获取配置集需要指定:
1.nacos服务地址,必须指定
2.namespace,如果不指定默认为public
3.group,如果不指定默认DEFAULT_GROUP
4.dataId,必须指定
示例
在Nacos建立配置文件
新建工程导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
编写bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.112.130:8848 #配置中心地址
file-extension: yaml #配置文件后缀名
prefix: nacos-config #配置文件前缀名
编写controller读取配置文件信息(采用bootstrap.yml方式只识别配置中心拉取下来的数据才有效果,如果在bootstrap.yml中进行服务的的注册配置将无效果,当所要读取的配置文件不存在的时候会直接报错)
@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.type}")
private String type;
@GetMapping("/config/info")
public String getConfigInfo() {
System.out.println(this);
String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}
启动
成功注册服务
当配置文件修改后,通过@RefreshScope注解重新从BeanFactory获取一个新的实例,对配置文件的信息重新赋值达到更新配置信息的效果
由此可以推测大概的工作流程就是:服务启动根据配置中心的地址和配置文件名,在配置中心找到该文件,将内容交给springboot读取,可以想象成把配置中心的配置信息加载到springboot中的配置文件读取。
Nacos集群和持久化
为什么要进行持久化,当我们使用集群的时候使用Nacos自带的derby数据库无法实现多台Nacos中数据的同步,我们需要使用mysql作为Nacos的数据源
修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111
Nacos集群
集群搭建
1.找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf
2.复制三份Nacos
[root@localhost bin]# cd /usr/local
[root@localhost java]# mkdir nacos_cluster
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850
3.修改每台的端口号
4.安装Nginx
(1)安装nginx依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
(2)下载Nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
(3)解压
tar -zxvf nginx-1.12.0.tar.gz
(4)配置nginx
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
(5)./configure配置nginx安装到/usr/java/nginx目录下
编译并安装
make && make install
5.配置nginx代理nacos
测试
1,启动集群
[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh
2,启动Nginx
[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx
通过Nginx负载均衡访问Nacos
http://192.168.112.130/nacos/
添加配置文件并启动服务通过Nginx注册到Nacos
此时三台Nacos都能读取到该配置文件
该文件在Mysql的位置
访问端口为8848的Nacos
访问端口为8849的Nacos
访问端口为8850的Nacos
同时三台nacos都能读取到相同的配置文件,所以Nginx负载均衡保证了Nacos集群的数据(服务信息)同步,使用Mysql作为Nacos的数据源保证了Nacos集群配置文件信息的同步。
至少三台Nacos主要是因为Nginx负载均衡需要选取老大