幸いですlog

初体验SpringCloud
🍃

初体验SpringCloud

description
Created
Jun 3, 2022 08:46 AM
Updated
Last updated June 4, 2022

SpringCloud架构图

notion image

服务发现产品对比

notion image
notion image

Nacos功能

notion image
这里说的也是单机版部署教程
docker start nacos
用起来非常简单, 每次需要用到执行上面的命令即可.
docker run部署
获取镜像
docker pull nacos/nacos-server

2、创建本地的映射文件,custom.properties,

mkdir -p /root/nacos/init.d /root/nacos/logs touch /root/nacos/init.d/custom.properties
在文件中写入以下配置
management.endpoints.web.exposure.include=*
初始化nacos数据库
运行镜像
docker run -d -p 8848:8848 \-e MODE=standalone \-e PREFER_HOST_MODE=hostname \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=172.21.0.3 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_DB_NAME=nacos_config \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=sth773178 \-e MYSQL_DATABASE_NUM=1 \-v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \-v /root/nacos/logs:/home/nacos/logs \--network common-network --name nacos nacos/nacos-server spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC db.user=root db.password=sth773178
docker exec -it 6aeff396d730 /bin/bash
vim conf/application.properties
// 修改对应mysql参数
docker restart nacos/nacos-server
docker restart
用户密码都是 nacos

如何加载mysql8.0

打开启动程序源码发现需要在启动jar包的位置加入对应的mysql便可
notion image
notion image
notion image
notion image

Restful服务发现

测试环境

notion image
采用springcloud Alibaba 采用微服务开发框架
notion image

父组件

关于springboot,springcloud,springcloud alibaba 版本冲突的问题
<dependencies>            <dependency>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-dependencies</artifactId>                <version>2.2.2.RELEASE</version>                <type>pom</type>                <scope>import</scope>            </dependency>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Hoxton.SR10</version>                <type>pom</type>                <scope>import</scope>            </dependency>            <dependency>                <groupId>com.alibaba.cloud</groupId>                <artifactId>spring-cloud-alibaba-dependencies</artifactId>                <version>2.2.1.RELEASE</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>

加入服务请求客户端

服务发现的客户端,1、将自己的地址注册到服务发现中心 2、从服务发现中心获取服务列表
<dependency>    <groupId>com.alibaba.cloud</groupId>     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> server: port: 56010 spring: application:   name: nacao-restful-provider #服务名 cloud:   nacos:     discovery:       server-addr: 127.0.0.1:8848 #服务发现中心
//智能访问 指定服务名    String sericeId="nacos-restful-consumer"; //通过负载均衡发现地址,流程是从服务发现中序拿到 nacos-restful-consumer通过负载均衡算法获取一个地址    @Autowired    LoadBalancerClient loadBalancerClient;    @GetMapping("/service1")    @ResponseBody    public  String service1(){        //远程调用        RestTemplate restTemplate=new RestTemplate();        //发现地址 http://开头地址        ServiceInstance choose = loadBalancerClient.choose(sericeId);        URI uri = choose.getUri();        String forObject = restTemplate.getForObject(uri + "/service",String.class);        return "consumer invoder |"+forObject;   }

负载均衡

notion image
notion image
notion image
notion image
~
#配置其他的策略 nacos-restful-provider: ribbon:   NFloadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Dubbo服务发现

notion image
、下图是微服务采用Dubbo协议的系统架构图
notion image
notion image
notion image

dubbo服务搭建

父工程:仍然使用nacos-dicovery
application1:使用nacos-restful-consumer
service1微服务:需要新建
service2微服务:需要新建
api网关:

service2微服务

notion image

定义service2-api

1、创建service2工程
nacos-dubbo-service2
<?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>itmayiedu-shopp-parent</artifactId>        <groupId>org.clover</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>nacos-dubbo-service2</artifactId>    <packaging>pom</packaging>    <modules>        <module>service2-api</module>        <module>service2-server</module>    </modules> </project>
2、创建service2-api 接口
public interface Service2Api { public String dubboService2(); }
3、定义接口实现 先把 Service2-api 中的引入进来
<parent> <artifactId>nacos-dubbo-service2</artifactId> <groupId>org.clover</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>service2-server</artifactId> <dependencies> <dependency> <groupId>org.clover</groupId>//上层id <artifactId>service2-api</artifactId> //项目名子 <version>1.0-SNAPSHOT</version> //版本 </dependency> //引入dubbo <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency> //服务发现和注册依赖 <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> //实现之前的 用dubbo的 @Service public class Service2ApiImpl implements Service2Api{ public String dubboService2() { return null; } }
VPS
配置bootstrap.yml
server: port: 56040 spring: application: name: service2-server main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: scan: base-packages: service2.api # dubbo 协议 protocol: name: dubbo port: 20891 registry: address: nacos://127.0.0.1:8848 application: qos-enable: false #dubbo运维服务是否开启 consumer: check: false #启动时 检查依赖服务
notion image

修改application

<dependency> <groupId>org.clover</groupId> <artifactId>service2-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-dubbo</artifactId> </dependency>

远程调用 rpc调用

@Reference //把dobbo提通的注解 把接口注入进来 生成代理对象 Service2Api service2Api ; GetMapping("/service2") @ResponseBody public String service2(){ //远程调用service2 String s=service2Api.dubboService2(); return "consumer dubbo invoder |" +s; }

同样的方法创建service1

notion image
//使用service1->server2 <dependency> <groupId>org.clover</groupId> <artifactId>service1-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.clover</groupId> <artifactId>service2-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> @org.apache.dubbo.config.annotation.Service public class Service1ApiImpl implements Service1Api{ @Reference Service2Api service2Api; public String dubboService1() { //远程调用service2 String s=service2Api.dubboService2(); return "dubboService1 |"+s; } }
配置文件
server: port: 56030 spring: application: name: service1-server main: allow-bean-definition-overriding: true cloud: nacos: discovery: server-addr: 127.0.0.1:8848 dubbo: scan: base-packages: service1.api # dubbo 协议 protocol: name: dubbo port: 20881 registry: address: nacos://127.0.0.1:8848 application: qos-enable: false #dubbo运维服务是否开启 consumer: check: false #启动时 检查依赖服务

服务发现模型

notion image
notion image
notion image
notion image
notion image
notion image

Namespace模型设计

spring: application: name: nacos-restful-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: ea8a67b7-245b-45a5-b328-2bef4ff42953 #修改环境id

配置管理

配置中心

notion image

什么时配置中心

notion image
notion image
流程:
用户在配置中心更新配置信息
服务A和服务B及时得到配置更新通知,从配置中心获取配置。
notion image

主流配置中心对比

notion image
notion image
notion image

Nacos配置管理

发布配置

Data ID: nacos-restful-consumer.yaml 组 Group : DEFAULT_GROUP 描述 配置格式: yaml 配置内容: common: name: application1 config
notion image
notion image

获取配置

nacos-restful-consumer工程的controller中增加获取配置的web访问端点/configs,通过标准的spring
@Value方式
@Value("${common.name}") private String common_name; @GetMapping("/configs") public String getValue(){ return common_name; }
<!-- 配置中心信息 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
spring: application: name: nacos-restful-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 #指定配置中心地址 #也可以指定namespace #指定配置文件扩展名,配置文件名称根据application.name的名称扩展名拼装 #nacos-restful-consumer.yaml file-extension: yaml group: DEFAULT_GROUP
注意:要使用配置中心,要用bootstrap.yml,bootstrap.yml配置文件的加载顺序要比application.yml优先
因为配置的要启动的时候用。bootstrap.yml就是系统启动的时候加载
notion image

动态获取配置信息

@Autowired ConfigurableApplicationContext configurableApplicationContext; @GetMapping("/configs") public String getValue(){ return configurableApplicationContext.getEnvironment().getProperty("common_name"); }
notion image
notion image
notion image

模型

notion image
notion image
notion image
notion image

自定义扩展的Data id配置

ext-config扩展配置

spring cloud alibaba nacos
notion image
notion image
spring: application: name: nacos-restful-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 config: server-addr: 127.0.0.1:8848 #指定配置中心地址 #指定配置文件扩展名,配置文件名称根据application.name的名称扩展名拼装 #nacos-restful-consumer.yaml file-extension: yaml group: DEFAULT_GROUP #自定义的配置信息 ext-config[0]: data-id: ext-config-common1.yaml group: COMMON_GROUP refresh: true #自动刷新 ext-config[1]: data-id: ext-config-common2.yaml group: COMMON_GROUP refresh: true
根据ext-config[1] 数组越大优先级越高。
主配置文件的优先级高于扩展配置文件

案例 抽取

#HTTP格式配置 spring: http: encoding: charset: UTF-8 force: true enabled: true messages: encoding: UTF-8 #tomcat头信息和访问路径配置 server: tomcat: remote_ip_header: x-forwarded-for protocol_header: x-forwarded-proto servlet: context-path: /a #修改路径 use-forward-headers: true

总结

notion image
notion image
notion image

Mybtis Plus

notion image

特性

mp INSERT into `tb_user`(`id`,`user_name`,`password`,`name`,`age`,`email`,`birthday`) VALUES (1,'zhangsan','123456','张三',18,'test1@itcast.cn','2019-09-26 11:42:01'), (2,'lisi','123456','李四',20,'test2@itcast.cn','2019-09-25 11:42:09'), (3,'wangwu','123456','王五',28,'test3@itcast.cn','2019-09-24 11:42:09'), (4,'zhaoliu','123456','赵六',21,'test4@itcast.cn','2019-09-23 11:42:09'), (5,'sunqi','123456','孙七',24,'test5@itcast.cn','2019-09-22 11:42:09');
notion image

工程搭建

创建工程
#User @Data @NoArgsConstructor @AllArgsConstructor @TableName("tb_user") public class User { @TableId("ID") private Long id; @TableField("USER_NAME") private String userName;//驼峰命名,则无需注解 @TableField("PASSWORD") private String password; @TableField("NAME") private String name; @TableField("AGE") private String age; @TableField("EMAIL") private String email; @TableField("BIRTHDAY") private LocalDateTime birthday; } public interface UserMapper extends BaseMapper<User> { } @MapperScan("com.clover.mapper") @org.springframework.boot.autoconfigure.SpringBootApplication public class SpringBootApplication { public static void main(String[] args) { SpringApplication.run(SpringApplication.class,args); } }

闪具支付

notion image
notion image

搭建项目

单独使用DTO,是为了避免模型和数据库表命不一致的情况
@ApiModel(value="MerchantDTO", description="") 实体类名 @ApiModelProperty(value = "主键") 参数
流程就是api-service 是dubbo 而application 是面向服务的restful类型http+json
@PathVariable 映射 URL 绑定的占位符

几个配置信息

spring-boot-http.yaml
#HTTP格式配置 spring: http: encoding: charset: UTF-8 force: true endbled: true messages: encoding: UTF-8 server: tomcat: remote_ip_header: x-forwarded-for protocol_header: x-forwarded-proto servlet: context-path: / use-forward-headers: true management: endpoints: web: exposure: include: refresh,health,info,env
spring-boot-starter-druid.yaml
#覆盖访问路径 server: servlet: context-path: /merchant #启用swagger swagger: enable: true
merchant-application.yaml
spring: # 数据库配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/yuehui91?useSSL=false&useUnicode=true&characterEncoding=utf8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 username: root password: 773178 type: com.alibaba.druid.pool.DruidDataSource druid: initial-size: 5 min-idle: 5 max-active: 60000 time-between-log-stats-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: true test-on-return: false pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 filter: stat: slow-sql-millis: 1 log-slow-sql: true filters: config,stat,wall,log4j2 web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" session-stat-enable: false session-stat-max-count: 1000 principal-cookie-name: admin principal-session-name: admin profile-enable: true stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: false login-password: admin login-username: admin aop-patterns: com.shanjupay.*.service.*
merchant-service.yaml
#覆盖访问路径 server: servlet: context-path: /merchant-service spring: # 数据库配置 datasource: url: jdbc:mysql://127.0.0.1:3306/shanjupay_merchant_service?useSSL=false&useUnicode=true&characterEncoding=utf8&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 username: root password: 773178 mybatis-plus: type-aliases-package: com.shanjupay.merchant.entity mapper-locations: classpath:com/shanjupay/*/mapper/*.xml
spring-boot-mybatis-plus.yaml
mybatis-plus: configuration:   cache-enabled: false   map-underscore-to-camel-case: true global-config:   id-type: 0   field-strategy: 0   db-column-underline: true   refresh-mapper: true type-aliases-package: com.shanjupay.user.entity mapper-locations: classpath:com/shanjupay/*/mapper/*.xml

API详细说明

注释汇总
作用范围
API
使用位置
对象属性
@ApiModelProperty
用在出入参数对象的字段上
协议集描述
@Api
用于controller类上
协议描述
@ApiOperation
用在controller的方法上
Response集
@ApiResponses
用在controller的方法上
Response
@ApiResponse
用在 @ApiResponses里边
非对象参数集
@ApiImplicitParams
用在controller的方法上
非对象参数描述
@ApiImplicitParam
用在@ApiImplicitParams的方法里边
描述返回对象的意义
@ApiModel
用在返回对象类上
spring:  datasource:    username: root    password: root    driver-class-name: com.mysql.jdbc.Driver    url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8    type: com.alibaba.druid.pool.DruidDataSource    druid:      #初始化连接池大小      initial-size: 5      #配置最小连接数      min-idle: 5      #配置最大连接数      max-active: 20      #配置连接等待超时时间      max-wait: 60000      #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒      time-between-eviction-runs-millis: 60000      #配置一个连接在池中最小生存的时间,单位是毫秒      min-evictable-idle-time-millis: 300000      #测试连接      validation-query: SELECT 1 FROM DUAL      #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全      test-while-idle: true      #获取连接时执行检测,建议关闭,影响性能      test-on-borrow: false      #归还连接时执行检测,建议关闭,影响性能      test-on-return: false      #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭      pool-prepared-statements: true      #开启poolPreparedStatements后生效      max-pool-prepared-statement-per-connection-size: 20      #配置扩展插件,常用的插件有=>stat:监控统计  log4j:日志  wall:防御sql注入      filters: stat,wall,slf4j      #打开mergeSql功能;慢SQL记录      connection-properties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000      #配置DruidStatFilter      web-stat-filter:        enabled: true        url-pattern: "/*"        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"      #配置DruidStatViewServlet      stat-view-servlet:        url-pattern: "/druid/*"        #IP白名单(没有配置或者为空,则允许所有访问)        allow: 127.0.0.1,192.168.163.1        #IP黑名单 (存在共同时,deny优先于allow)        deny: 192.168.1.73        # 禁用HTML页面上的“Reset All”功能        reset-enable: false        #登录名        login-username: root        #登录密码        login-password: root
startup.cmd -m standalone

异常

notion image

曾经也有 个和你一样的人来过这里。

「姿や形は問題ではなく、「魂」が問題です。」

Vercel Logo

「健全なる魂は健全なる精神と健全なる肉体に宿る。」

「あなたの魂、受け取りました。」

VercelVercel

Clover © 2022 幸いです 全著作権所有.