Spring Cloud Alibaba
1、什么是Spring Cloud Alibaba?
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟Spring Cloud官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:
2、Spring Cloud Alibaba 案例
接下来我们创建一个工程来使用Spring Cloud Alibaba
2.1、首先创建一个父工程springcloud_parent,并在父工程中加入所以下依赖
2.1.1、pom.xml
<properties>
<!-- 项目源码及编译输出的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 项目编译JDK版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.2、创建公共模块springcloud_common
其不需要加入任何依赖
2.2.1、公共模块需要有一个实体类pojo
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.3、创建nacos_provider
2.3.1、在其pom.xml中加入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2.3.2、在application.yml中配置一个端口号
server:
port: 9090
2.3.3、创建一个UserService接口
package com.bjpowernode.service;
import com.bjpowernode.pojo.User;
public interface UserService {
User getUserById(Integer id);
}
2.3.4、创建一个实现类来实现这个接口
package com.bjpowernode.service;
import com.bjpowernode.pojo.User;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id, "自来也", 25);
}
}
2.3.5、创建一个controller接口
package com.bjpowernode.controller;
import com.bjpowernode.pojo.User;
import com.bjpowernode.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable("id") Integer id){
return userService.getUserById(id);
}
}
2.4、创建nacos_consumer
2.4.1、在pom.xml中加入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>springcloud_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
2.4.2、写一个用来发送restful请求的工具类
package com.bjpowernode.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class BeanConfig {
//RestTemplate:发送restful请求的工具类
@Bean
public RestTemplate RestTemplate(){
return new RestTemplate();
}
}
2.4.3、写一个controller来接收请求
package com.bjpowernode.controller;
import com.bjpowernode.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
//访问Rest服务的客户端
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value="/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//调用服务
String url = "http://127.0.0.1:9090/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}
2.2.5、分别启动nacos_provide和nacos_consumer的启动类,然后在浏览器地址栏中输入nacos_provide的url就可以访问到,成功界面如下:
2.3、问题
在上述案例中,由于我们把地址的ip和端口号写死了,显然是不行的,没有办法搭建集群
那么应该怎么解决呢,这时候就需要通过注册中心动态的实现服务治理。
3、Nacos简介
3.1、Nacos安装和启动
3.1.1.下载
下载地址:https://github.com/alibaba/nacos/tags
3.1.2.安装
解压安装包:
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
3.1.3.启动和关闭
启动:
[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
... ...
nacos is starting with standalone
nacos is starting,you can check the /usr/java/nacos/logs/start.out
关闭:
[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK
[root@localhost bin]
3.1.4.测试
浏览器访问:http://192.168.241.131:8848/nacos(这是我自己的地址,测试用自己的),默认用户名/密码为: nacos/nacos
若成功安装了nacos会显示以下界面:
成功登录会显示以下界面:
4、Nacos注册中心入门
4.1、修改nacos_provider
4.1.1、在pom.xml文件中加入以下依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.1.2、修改其application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.241.131:8848
application:
name: nacos-provider
4.1.3、在其启动类上加入@EnableDiscoveryClient注解
4.2、nacos_consumer重复以上操作并修改controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable("id") Integer id){
ServiceInstance server = discoveryClient.getInstances("nacos-provider").get(0);
String url = "http://"+server.getHost()+":"+server.getPort()+"/provider/getUserById/" + id;
return restTemplate.getForObject(url, User.class);
}
}
5、Nacos配置中心
5.1、Nacos配置中心入门案例
5.1.1、创建nacos_config并加入以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
5.1.2、创建bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.241.131:8848 #这是我自己的nacos地址
file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
5.1.3、启动类加入@SpringBootApplication和@EnableDiscoveryClient注解
5.1.4、创建controller
package com.bjpowernode.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@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;
}
}
5.1.5、在浏览器nacos页面配置列表添加配置文件
-
新建配置文件
-
添加配置文件
- 填写配置文件名称、格式、内容
-
内容如下:
server: port: 80 spring: cloud: nacos: discovery: server-addr: 192.168.241.131:8848 application: name: nacos-config datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/ican?serverTimezone=Asia/Shanghai username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource
3.浏览器访问:http://127.0.0.1/config/info
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnwRTGEy-1668681781292)(D:\桌面\屏幕截图 2022-11-06 202440.jpg)]
6、Nacos集群和持久化
6.1在nacos中进入usr/local/nacos/config中,修改application.properties
6.1.1、连接mysql并将usr/local/nacos/config中的nacos-mysql.sql复制到可视化工具中运行,会出现以下表
6.1.2、重启nacos
6.1.3、进入浏览器nacos页面加入配置后,config_info表中就会出现数据
6.2、nacos集群搭建
6.2.1修改nacos的cluster.conf,配置3台nacos的通讯地址
cd /usr/local/nacos/conf
cp cluster.conf.example cluster.conf
vim cluster:
192.168.241.131:8848
192.168.241.131:8849
192.168.241.131:8850
6.2.2、复制三台nacos
cd /usr/local
mkdir nacos_cluster
cp -r nacos nacos_cluster/nacos_8848
cp -r nacos nacos_cluster/nacos_8849
cp -r nacos nacos_cluster/nacos_8850
6.2.3、修改3台nacos的port
vim /usr/local/nacos_cluster/nacos_8849/conf/application.properties:
server.port=8849
vim /usr/local/nacos_cluster/nacos_8849/conf/application.properties:
server.port=8849
6.2.4、启动集群
cd /usr/local/nacos_cluster/nacos_8848/bin
./startup
cd /usr/local/nacos_cluster/nacos_8849/bin
./startup
cd /usr/local/nacos_cluster/nacos_8850/bin
./startup
6.3、配置代理服务
6.3.1.安装nginx
- 安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
- 下载nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
- 解压安装包
tar -zxvf nginx-1.12.0.tar.gz
- 配置nginx安装包
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
- nginx启动和关闭
启动:
cd /usr/local/nginx/sbin
./nginx
关闭:
cd /usr/local/nginx/sbin
./nginx -s stop
6.3.2、配置nginx代理nacos集群
upstream nacos {
server 192.168.241.131:8848;
server 192.168.241.131:8849;
server 192.168.241.131:8850;
}
server {
location / {
proxy_pass http://nacos;
}
}
6.4、测试
6.4.1、启动nacos集群和nginx
6.4.2、修改配置文件
6.4.3、启动服务
- 通过nginx访问nacos集群:http://192.168.241.131/nacos
7、设置Nacos自启动
8.1.1、我们每次使用nacos都要开启虚拟机然后启动很麻烦,我们可以将nacos设置为自启动
7.1、首先添加开机自启动文件:
vim /lib/systemd/system/nacos.service:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
7.2、修改nacos的startup.sh
vim /usr/local/nacos/bin/startup.sh:
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
7.3、然后按照以下顺序依次执行:
systemctl daemon-reload #重新加载服务配置
systemctl start nacos.service #启动nacos服务
systemctl status nacos.service #查看nacos服务的状态
systemctl enable nacos.service #设置为开机启动