Spring Cloud Alibaba 的使用

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);
    }
}
  • 重新启动两个启动类并访问nacos页面
  • 成功则会出现以下页面

请添加图片描述

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页面配置列表添加配置文件
  1. 新建配置文件

    请添加图片描述

  2. 添加配置文件

    1. 填写配置文件名称、格式、内容

请添加图片描述

  1. 内容如下:

    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 #设置为开机启动
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring CloudSpring Cloud Alibaba都是基于Spring Framework的开源框架,用于构建分布式系统和微服务架构。它们都提供了一系列的组件和工具来简化微服务开发和管理。 Spring Cloud是一个由Pivotal团队维护的项目,它集成了Netflix开源的一些组件,如Eureka作为注册中心、Ribbon作为负载均衡器、Feign作为服务调用工具等。同时,Spring Cloud还提供了其他功能,如Config Server用于动态管理配置、Gateway用于构建API网关等。 而Spring Cloud Alibaba则是阿里巴巴开源的项目,它在Spring Cloud的基础上进行了扩展和定制,增加了一些阿里巴巴自己的组件和工具。比如,它使用Nacos作为注册中心和配置中心,使用Sentinel作为熔断降级工具。 总的来说,Spring CloudSpring Cloud Alibaba都是用于构建微服务架构的框架,它们的区别在于Spring Cloud集成了Netflix组件,而Spring Cloud Alibaba集成了阿里巴巴的一些组件。根据具体的需求和技术栈选择使用哪个框架可以更好地满足开发和管理微服务的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring Cloud AlibabaSpring Cloud的区别](https://blog.csdn.net/weixin_43888891/article/details/126653270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值