目录
一.认识微服务
1.0.学习目标
1.1.单体架构
单体架构的优缺点如下:
1.2.分布式架构
分布式架构的优缺点:
1.3.微服务
微服务的架构特征:
1.4.SpringCloud
1.5Nacos注册中心
1.6.总结
二、Nacos基本使用
(一)linux安装包方式单节点安装部署
1. jdk安装配置
2. nacos安装
(二)linux源码方式单节点安装部署
1、下载Nacos源码并解压缩,另一种方法
2、配置Nacos
3、创建数据库和数据表
4、启动Nacos
(三)Nacos集成SpringBoot实现服务注册与发现
1、创建父工程
2、创建基础公共模块
3、创建用户模块
4、将用户模块作为微服务注册到nacos
(四)解决登录问题
三、基于Feign实现服务之间的远程调用
(一)什么是Feign
(二)Feign的使用
1、加入Fegin的依赖
2、在user模块启动类上添加Fegin的注解
3、创建order-module模块
4、创建一个feign接口, 并使用Fegin实现微服务调用order模块的数据
5、controller调用feign,并启动user模块服务验证
(三)Feign负载均衡
1、首先要把order模块设置为可以开启多个服务
2、注意:多次启动的端口号不能一致
3、测试
注意:只要开启虚拟机,一定要关闭防火墙
一.认识微服务
随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?
1.0.学习目标
了解微服务架构的优缺点
1.1.单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

单体架构的优缺点如下:
优点:
-  
架构简单
 -  
部署成本低
 
缺点:
-  
耦合度高(维护困难、升级困难)
 
1.2.分布式架构
分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。

分布式架构的优缺点:
优点:
-  
降低服务耦合
 -  
有利于服务升级和拓展
 
缺点:
-  
服务调用关系错综复杂
 
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:
-  
服务拆分的粒度如何界定?
 -  
服务之间如何调用?
 -  
服务的调用关系如何管理?
 
人们需要制定一套行之有效的标准来约束分布式架构。
1.3.微服务
微服务:一种良好架构设计的分布式架构方案
根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。
项目中每一个模块(module)就叫做一个服务
SpringCloud是目前国内使用最广泛的微服务框架
SpringCloud-Alibaba 也推出了一个名为Nacos的注册中心组件。
微服务的架构特征:
-  
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,每个服务只做一件事
 -  
自治:团队独立、技术独立、数据库独立,独立部署和交付
 -  
面向服务:服务提供统一标准的接口,与语言和技术无关
 -  
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
 

微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。
因此,可以认为微服务是一种经过良好架构设计的分布式架构方案 。
但方案该怎么落地?选用什么样的技术栈?全球的互联网公司都在积极尝试自己的微服务落地方案。
其中在Java领域最引人注目的就是SpringCloud提供的方案了。
1.4.SpringCloud
SpringCloud是目前国内使用最广泛的微服务框架。官网地址:Spring Cloud。
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
其中常见的组件包括:

另外,SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:官网版本说明

1.5Nacos注册中心
Nacos:服务注册中心,项目每一个module模块启动服务都会注册到Nacos网站里面
国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 SpringCloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。
1.6.总结
-  
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
 -  
分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
 -  
微服务:一种良好的分布式架构方案
①优点:拆分粒度更小、服务更独立、耦合度更低
②缺点:架构非常复杂,运维、监控、部署难度提高
 -  
SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件
 -  
Nacos:服务注册中心,SpringCloudAlibaba推出的微服务功能组件。
 
二、Nacos基本使用
(一)linux安装包方式单节点安装部署
官方快速开始教程连接地址
 Nacos支持三种部署模式,分别是单机,集群和多集群。需要注意的是,Nacos依赖Java环境,并且要求使用JDK1.8以上版本。
 Nacos的安装方式有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。这里选择使用安装包方式安装。
1. jdk安装配置
在 Linux 中安装和配置 JDK 需要以下步骤:
 检查系统中是否已经安装过 JDK 和 JRE。可以使用以下命令来检查:
java -version
 
如果系统中没有安装 JDK 和 JRE,则需要下载并安装 JDK。
 下载教程:Linux安装配置jdk11_jdk-11.0.12_linux-x64_bin.tar.gz_半截的诗--的博客-CSDN博客
验证 JDK 是否安装配置成功。可以使用以下命令:
java -version
 
执行该命令后,应该能看到已经安装的 JDK 版本信息。

2. nacos安装
- 下载nacos的GitHub地址
 

2、解压Nacos安装包
tar -zxvf nacos-server-2.2.2.tar.gz  -C /opt/enviroment/
 
解压完成后,会在解压的目录中看到一个nacos的文件夹。
3、关闭防火墙
查看防火状态
systemctl status firewalld

关闭防火墙:
systemctl stop firewalld
4、启动Nacos服务
  进入nacos,执行以下命令:
[root@bogon nacos]# sh bin/startup.sh -m standalone
/java/jdk-11.0.16//bin/java   -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xlog:gc*:file=/nacos/nacos/logs/nacos_gc.log:time,tags:filecount=10,filesize=102400 -Dloader.path=/nacos/nacos/plugins/health,/nacos/nacos/plugins/cmdb,/nacos/nacos/plugins/selector -Dnacos.home=/nacos/nacos -jar /nacos/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/nacos/nacos/conf/ --logging.config=/nacos/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /nacos/nacos/logs/start.out
 
这样,就会启动Nacos服务。
5、访问Nacos服务
执行以下命名
[root@localhost nacos]# cat /opt/enviroment/nacos/logs/start.out 

 Nacos默认的访问地址为http://localhost:8848/nacos,如果用虚拟机部署的Nacos服务,那访问地址就是虚拟机的IP地址了:http://192.168.100.129:8848/nacos/index.html
 可以在浏览器中输入该地址来访问Nacos服务。如果一切正常,将会看到Nacos的登录界面,输入默认账号(nacos)密码(nacos)即可登录。
 到此,Nacos服务在Linux环境下的安装部署就完成了。如果想要深入了解更多关于Nacos的使用和配置,可以查看Nacos官方文档(https://nacos.io/zh-cn/docs/what-is-nacos.html)。

(二)linux源码方式单节点安装部署
1、下载Nacos源码并解压缩,另一种方法
可以省略,继续下面步骤
在官网 https://github.com/alibaba/nacos/releases 下载源代码,可以选择.tar.gz或.zip格式的文件,解压到你想要安装的目录中。
wget https://github.com/alibaba/nacos/releases/download/2.2.2/nacos-server-2.2.2.tar.gz
tar -zxvf nacos.tar.gz
 
2、配置Nacos
第一步可以省略,可以进行按照上面的步骤进行,直接使用上面解压的nacos文件
进入解压后的nacos目录,修改conf/application.properties文件:
# 启用standalone模式
nacos.standalone=true
# 修改端口号
server.port=8848
# 修改数据存储位置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.216.176:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
 
注意要修改以下参数:
 server.port:修改为要使用的端口号
 db.url.0:修改为MySQL数据库的连接地址,IP地址是当前网络属性的IPv4地址,
db.user、db.password:并设置正确的数据库用户名和密码
3、创建数据库和数据表
使用MySQL客户端创建nacos数据库和数据表
找到虚拟机中/opt/enviroment/nacos/conf文件夹

去MySQL客户端运行mysql-schema.sql文件

 
创建完成如下:
 
4、启动Nacos
进入解压后的nacos文件夹,使用以下命令启动Nacos服务:
[root@bogon nacos]# sh bin/startup.sh -m standalone 
如果启动成功,你应该可以在浏览器中访问
http://虚拟机ip地址:8848/nacos
http://192.168.100.129:8848/nacos/
来查看Nacos控制台。
至此,Nacos就成功安装完成了。
(三)Nacos集成SpringBoot实现服务注册与发现
1、创建父工程
创建一个maven工程,然后在pom.xml文件中添加下面内容
 各个版本的对应关系参考官网:官网版本对应关系描述地址
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>spring-Cloud</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>User-module</module>
        <module>common</module>
    </modules>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <!--springboot依赖版本是2.6。11-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencyManagement>
        <dependencies>
            <!--Cloud依赖 版本2021.0.4-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.4</version>
 <!--type和scope是代表子模块可以继承cloud这个版本,子模块要是下载关于cloud的依赖,就默认使用这个版本了-->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--阿里巴巴依赖 版本2021.0.4.0-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project> 
2、创建基础公共模块
创建common公共模块

在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.common.yka</groupId>
    <artifactId>common</artifactId>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!--web场景开发启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.15</version>
        </dependency>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <!-- mybatis-plus启动器-->
        <!-- mybatis-plus 是自己开发,并非官方的! -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project> 
3、创建用户模块
步骤:
 1 创建模块

2、导入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.user.yka</groupId>
    <artifactId>User-module</artifactId>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--引用公共common的pom.xml依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project> 
引用公共pom.xml配置文件,直接就可以使用pom文件的依赖了

3、 创建SpringBoot主类
@SpringBootApplication
public class UserApplication {
  public static void main(String[] args) {
      SpringApplication.run(UserApplication.class,args);
  }
} 
4、加入配置文件
spring:
  application:
    name: user-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456 
5、创建必要的接口和实现类(controller service dao)
@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/test")
    public String test(){
        return "aaaaaa";
    }
} 
4、将用户模块作为微服务注册到nacos
接下来开始修改User-module模块的代码, 将其注册到nacos服务上
1、在User-module模块的pom.xml中添加nacos的依赖
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
 
2、在主类上添加@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
  public static void main(String[] args) {
      SpringApplication.run(UserApplication.class,args);
  }
} 
3、在application.yml中添加nacos服务的地址
spring:
  application:
    name: user-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号 
4、启动服务, 观察nacos的控制面板中是否有注册上来的商品微服务,即为成功
注意:只要开启虚拟机,一定要关闭防火墙
如果启动不了报错,有可能出现的问题是:防火墙没有关闭,关闭防火墙后再去开启Nacos服务
查看防火状态
systemctl status firewalld

关闭防火墙:
systemctl stop firewalld
然后再去启动Nacos服务
(四)解决登录问题
到现在配置为止网页现在是跳过权限认证,不需要登录就进去了,我们来解决问题让nacos网页可以登录
修改 /nacos/conf/application.properties 配置文件
启动登录认证功能 nacos.core.auth.enabled=true 修改为true
客户端和服务端交互时用于加密的密钥,可以防止认证过程中的信息泄露。nacos.core.auth.server.identity.key=example nacos.core.auth.server.identity.value=example 赋值
设置 Token 认证的密钥:nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
Nacos集成SpringBoot实现服务注册与发现,操作服务注册是,yml文件中需要添加 username和passwrod
cloud: nacos: discovery: username: nacos #nacos网址的账号密码 password: nacos此时 sh shutdown.sh 关闭服务, 再重启服务,进入nacos页面就可以登录了
 
三、基于Feign实现服务之间的远程调用
简单来说:项目中模块之间可以相互调用
(一)什么是Feign
Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务 一样简单, 只需要创建一个接口并添加一个注解即可。 Nacos很好的兼容了Feign, Feign默认集成了 Ribbon, 所以在Nacos下使用Fegin默认就实现了负 载均衡的效果
(二)Feign的使用
1、加入Fegin的依赖
 <dependencies>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--引用公共common的pom.xml依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--负载均衡依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!--加入Fegin的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies> 
2、在user模块启动类上添加Fegin的注解
@SpringBootApplication
@EnableDiscoveryClient//@EnableDiscoveryClient是一个Spring Cloud中的注解,用于启用服务发现功能(nacos)。
@EnableFeignClients//开启Fegin
public class UserModuleApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserModuleApplication.class, args);
    }
} 
3、创建order-module模块
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-Cloud</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.order.yka</groupId>
    <artifactId>Order-module</artifactId>
    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!--引用公共模块common依赖-->
        <dependency>
            <groupId>org.common.yka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project> 
spring:
  application:
    name: order-server #服务名称
  # 配置数据源
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.100.129:8848 #虚拟机ip地址和端口号
        username: nacos #nacos网址的账号密码
        password: nacos
server:
  port: ${random.int[0000,9999]} #随机生成端口号
 
@RestController
@RequestMapping("/order")
public class OrderController {
    @GetMapping("/test")
    public Integer test(){
        return 1111;
    }
} 
4、创建一个feign接口, 并使用Fegin实现微服务调用order模块的数据
@FeignClient(value = "order-server",path = "/order")//value:声明调用的提供者的服务名,path:提供者的路径
public interface OrderFeign {
    //指定调用提供者的哪个方法
//@FeignClient+@GetMapping 就是一个完整的请求路径
    @GetMapping("/test")
    Integer getOrderNum();
} 

5、controller调用feign,并启动user模块服务验证
这就相当于user为客户端了,order为服务器,user服务向order服务发送请求
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private OrderFeign orderFeign;
    @GetMapping("/test")
    public Integer test(){
        return orderFeign.getOrderNum();
    }
} 

(三)Feign负载均衡
在Nacos下使用Fegin默认就实现了负载均衡的效果,以下只是展示理解理解
负载均衡(Load Balancing)是分布式系统架构中重要的机制之一。主要作用是将任务或请求分摊到多个服务器上,从而达到最大化吞吐量或最小化响应时间的目的。
1、首先要把order模块设置为可以开启多个服务


 可以在order模块的启动类上多次启动

2、注意:多次启动的端口号不能一致
接下来把order模块的端口号设置为随机的
server:
  port: ${random.int[0000,9999]} #随机生成端口号 
3、测试
把order模块的controller返回值修改333之后,启动一次order模块,启动后端口号会随机生成
一开始返回值是1111,他们分别开启了两个服务,所以端口号是不一致的
@RestController
@RequestMapping("/order")
public class OrderController {
    @GetMapping("/test")
    public Integer test(){
        return 3333;
    }
} 
 

访问网站,每次刷新都是不一样的数据

这就是负载均衡



















