微服务学习-SpringCloud -Nacos (单机部署)

Posted 空白Q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务学习-SpringCloud -Nacos (单机部署)相关的知识,希望对你有一定的参考价值。

文章目录

1,单机服务服务端搭建

  • 在nacos github上选择对应的版本下载,我下载的是2.1.1稳定版本。可下载windows或者linux版本,或者直接使用docker容器部署。
    链接:官方网站地址
  • 下载完成后解压文件,Windows下使用命令窗口,到bin目录下,执行以下命令:
    ​ startup.cmd -m standalone
    standalone代表着单机模式运行,非集群模式

    ​ 启动成功后如下图:

    然后打开nacos管理台:
    http://127.0.0.1:8848/nacos
    用户名/密码:nacos/nacos(默认值)
    进入后界面如下:

    这样服务端就算启动成功了。具体可参考官方手册:
    链接:官方手册

2,单机客户端搭建

  • 客户端搭建时各个版本依赖很重要,可以参考官网wiki:
  • 链接: 官方wiki
  • 以下是我使用的版本
<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.3.12.RELEASE</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-dependencies</artifactId>
         <version>Hoxton.SR8</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
      <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
         <version>2.2.5.RELEASE</version>
         <type>pom</type>
         <scope>import</scope>
      </dependency>
   </dependencies>
</dependencyManagement>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

配置文件中添加nacos地址:

启动服务:


打印如上内容时,说明服务已注册成功。现在查看管理台:

服务已成注册。

3,编写简单的客户端代码,实现注册中心调用

没有使用注册中心时,请求需要加对应的IP:端口

使用了nacos注册中心后,修改为对应的服务名即可,调用方不感知被调用服务的ip:端口。

此时调用时会报UnknownHostException错误。

因为此时调用需要使用LoadBalanced进行负载均衡,因为实际使用中机器不止一台,需要根据策略进行负载,所以需要加LoadBalanced。
加入Pom依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

RestTemplate加@LoadBalanced注解


此时正常调用服务。

SpringCloud学习--- 什么是微服务什么是SpringCloud?

一、微服务简介

我们直接举个例子来理解微服务
在这里插入图片描述
如图,一个购物服务会拆分为多个子功能,子功能分别看作一个微服务,然后他们有自己的端口,自己的数据库,这样的话,每个功能就可以给公司里不同小组进行开发,他们之间开发都是独立的。还有数据库,相比以前,都连接同一个数据库,如果数据库崩溃,那么整个系统就崩溃了,而现在每个微服务可以有自己的数据库,也可以多个连同一个,微服务满足松耦合的涉及理念,易于被开发人员理解,修改和维护,非常有学习的必要。

二、SpringCloud

SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡等。

SpringBoot和SpringCloud之间又有什么关系呢?
1、SpringBoot专注于快速方便的开发单个个体微服务,也就是开发一个个功能,最后打成jar包放到服务器上运行
2、SpringCloud是关注全局的微服务协调治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个服务之间提供:配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,分布式会话等集成服务。
3、SpringBoot可以独立于SpringCloud使用,但SpringCloud离不开SpringBoot,属于依赖关系
4、SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架。

两个学习SpringCloud的网站:
1、https://spring.io/projects/spring-cloud-netflix

2、https://www.springcloud.cc/spring-cloud-dalston.html

在这里插入图片描述

SpringCloud版本不是用数字的,它是按照名字来的,ABCDEFG,现在一般都用Hoxton SR5以上版本了,也比较稳定。我是跟着狂神视频学的,还跟着用下Greenwich,如果用Hoxton注意和SpringBoot的兼容即可,要版本对应上,比如Hoxton.SR8对应SpringBoot2.3.x

三、环境搭建:服务提供者

学SpringCloud之前,可以先看看这个Dubbo+Zookeeper+SpringBoot服务注册

新建一个Maven项目,取名springcloud,删除src目录,剩下如下图,然后先配置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>com.yx</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--打包方式pom-->
    <packaging>pom</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.13</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.18.12</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--SpringCloud依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--SpringBoot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--mysql数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
            <!--Druid连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.3</version>
            </dependency>
            <!--SpringBoot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.2</version>
            </dependency>
            <!--日志测试-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

项目中新建一个module
在这里插入图片描述
新建的模块pom文件,会有父类,父类就是这个springcloud项目,这个springcloud子类可以用父类中的依赖
在这里插入图片描述
springcloud-api只要引入父类中的依赖,就会导入,而父类中dependencyManagement下的依赖,它并没有导入,只是管理,即依赖管理
在这里插入图片描述
接下来创建数据库,因为是微服务,会有很多数据库,所以名字就DB01,DB02, … 一直往后,先创建DB01,然后在数据库中建表,建表sql如下

create table table_name
(
	dept_no bigint auto_increment,
	dept_name varchar(50) not null,
	db_source varchar(50) not null,
	constraint table_name_pk
		primary key (dept_no)
);

插入数据,DATABASE()表示获取数据库名

insert into dept(dept_name,db_source) values('研发部',DATABASE());
insert into dept(dept_name,db_source) values('人事部',DATABASE());
insert into dept(dept_name,db_source) values('运维部',DATABASE());
insert into dept(dept_name,db_source) values('财务部',DATABASE());
insert into dept(dept_name,db_source) values('市场部',DATABASE());

然后接下来就要写实体类,注意实体都要实现序列化,不然传输可能报错,这个api模块就管实体,拆分思想
在这里插入图片描述

@Data
@NoArgsConstructor
public class Dept implements Serializable {

    private Long deptNo;

    private String deptName;

    private String dbSource;

    public Dept(String deptName) {
        this.deptName = deptName;
    }
}

再创建一个provider模块,最后取名时也写上端口号
在这里插入图片描述
这里可以将之前写的模块引入,其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>springcloud</artifactId>
        <groupId>com.yx</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud_provider_dept_8001</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.yx</groupId>
            <artifactId>springcloud_api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

</project>

在这里插入图片描述
配置mybatis-config.xml和application.yml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--开启二级缓存-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>
server:
  port: 8001

mybatis:
  type-aliases-package: com.yx.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
spring:
  application:
    name: springcloud_provider_dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: root

之后就可以写dao层,service层,controller层
在这里插入图片描述


import com.yx.dao.DeptDao;
import com.yx.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptDao deptDao;

    @Override
    public List<Dept> queryAll() {
        return deptDao.queryAll();
    }
}

import com.yx.pojo.Dept;

import java.util.List;

public interface DeptService {

    List<Dept> queryAll();
}
import com.yx.dao.DeptDao;
import com.yx.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptDao deptDao;
    
    @Override
    public List<Dept> queryAll() {
        return deptDao.queryAll();
    }
}

DeptProvider_8001启动类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class,args);
    }
}

启动后访问 localhost:8001/dept/list
在这里插入图片描述

四、消费者Consumer

在这里插入图片描述
consumer操作就简单多了

@Configuration
public class ConfigBean {//@Configuration相当于spring中applicationContext.xml
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
@RestController
public class DeptConsumerController {

    //消费者不应该有service层
    //(url,参数实体(前提参数有),Class<T> responseType)
    @Autowired
    private RestTemplate restTemplate;  //提供多种便捷访问远程http服务的方法,一种简单的restful服务

    private static final String REST_URL_PREFIX = "http://localhost:8001";

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list",List.class);
    }
}
@SpringBootApplication
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}

application.yml只需要配置一个端口

server:
  port: 80

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=SpringCloud学习--- 什么是微服务什么是SpringCloud?

SpringCloud-Netflix入门学习笔记

微服务-SpringCloud学习系列:注册中心Eureka

微服务-SpringCloud学习系列:负载均衡Ribbon

springcloud学习2:使用feign进行微服务之间的调用

springcloud学习2:使用feign进行微服务之间的调用