SpringCloud入门实验环境搭建
作者:遇见_line 发布时间:2022-11-17 10:21:14
目录
微服务
微服务架构
SpringCould简介
环境搭建
1. 创建数据库
2. 新建一个子模块api
3. 新建一个子模块provider作为服务的提供者
新建子模块consumer作为消费者
debug
子项目无法使用父项目的依赖包
required a bean of type 'DeptDao' that could not be found.
Connection refused connect
RestTemplate传递对象无法接收(null)
微服务
个人理解:
所谓微服务是指每个模块都可以独立完成自己的核心业务,某一个模块的崩溃不影响其他模块的运行,
每个微服务有自己单独的一个数据库
每一个微小的服务组成了一个复杂的软件系统
微服务架构
微服务指的是服务的大小,关注的是完成一个具体的服务(医院的科室)
微服务架构是一种架构模式 ,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相
配合,为用户提供最终价值。一种将一个单一应用程序开发为一组小型服务的方法,每个服务都在其运行
的进程中。(整个医院)
优点:
针对特定服务发布,影响小,风险小,成本低
频繁发布版本,快速交付需求
低成本扩容,弹性伸缩,适应云环境
SpringCould简介
Springboot关注于更快的开发单体的微服务,而SpringCloud关注于全局服务的治理
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 Spring Boot 的开发风格做到一键启动和部署。
Spring 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 Spring Boot 风格进行再封装、屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
环境搭建
在idea中新建一个maven父工程在其pom配置对应依赖,以管理子类依赖的版本
<properties>
<lombock.version>1.18.18</lombock.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.2</version>
</dependency>
<!--spring cloud 依赖包-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring boot 依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--springboot 启动器-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter</artifactId>-->
<!-- <version>2.4.4</version>-->
<!-- </dependency>-->
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--lombock-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombock.version}</version>
<scope>import</scope>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
1. 创建数据库
创建名为db01的数据库,有一张表dept
2. 新建一个子模块api
其中只有一个实体类dept对应我们数据库中的表
public class Dept {
private int deptnumber;
private String dname;
private String d_source;
//对应属性的get和set方法
}
3. 新建一个子模块provider作为服务的提供者
导入依赖
<dependencies>
<!--将api模块导入由此可使用Dept实体类-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
配置配置文件和对应的操作类和接口
application.xml
server:
port: 8081
mybatis:
type-aliases-package: pojo
mapper-locations: classpath:Mybatis/mapper/*.xml
config-location: classpath:Mybatis/mybatis-config.xml
spring:
application:
name: provider-name
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/db01?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
mapper-config.xml和Deptmapper.xml
<?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>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.Dao.DeptDao">
<insert id="add" parameterType="Dept">
insert into dept(dname, d_source) values (#{dname},DATABASE());
</insert>
<select id="queryByID" resultType="Dept" parameterType="Long">
select * from dept where deptnumber = #{id};
</select>
<select id="queryAll" resultType="Dept">
select * from dept;
</select>
</mapper>
对应的Dao,Controller,Service
@Mapper
public interface DeptDao {
boolean add(Dept dept);
Dept queryByID(long id);
List<Dept> queryAll();
}
@Service
public class DeptImpl implements DeptService{
@Resource
private DeptDao deptDao;
public boolean add(Dept dept) {
return deptDao.add(dept) ;
}
public Dept queryByID(long id) {
System.out.println("deptimpl"+id);
return deptDao.queryByID(id);
}
public List<Dept> queryAll() {
return deptDao.queryAll();
}
}
@RestController
public class DeptController {
@Autowired
private DeptImpl deptimpl;
@PostMapping("/dev/add")
public boolean addDept(@RequestBody Dept dept){
System.out.println(dept);
return deptimpl.add(dept);
}
@GetMapping("/dev/{id}")
public Dept DeptqueryByID(@PathVariable("id") long id) {
System.out.println("deptcontroller"+id);
return deptimpl.queryByID(id);
}
@PostMapping("/dev/list")
public List<Dept> DeptqueryAll() {
return deptimpl.queryAll();
}
启动类
@SpringBootApplication
public class SApplication {
public static void main(String[] args) {
SpringApplication.run(SApplication.class,args);
}
}
新建子模块consumer作为消费者
导入依赖
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
server:
port: 80
config类和controller
/*
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例
如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。
*/
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@RestController
public class ConsumerController {
@Autowired
private RestTemplate template;
private static final String url="http://localhost:8001";
@RequestMapping("/consumer/get/{id}")
public Dept getByID(@PathVariable long id){
//请求的路径,请求返回的对象
Dept getEntity = template.getForObject(url + "/dev/" + id, Dept.class);
return getEntity;
}
@RequestMapping("/consumer/add")
public boolean add(String dname){
Dept dept = new Dept();
dept.setDname(dname);
System.out.println(dept);
//请求的路径,传递的参数,返回的对象
return template.postForObject(url+ "/dev/add",dept,Boolean.class);
}
@RequestMapping("/consumer/list")
public List<Dept> list(){
//请求的路径,返回的对象
return template.postForObject(url+"/dev/list",void.class,List.class);
}
}
启动类及运行结果
debug-connect refuserd---debug-传参为null
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
debug
子项目无法使用父项目的依赖包
1 如果父项目pom使用
<dependencyManagement>
<dependencies>
....
</dependencies>
</dependencyManagement>
方式,则子项目pom不会自动使用父pom中的jar包, 如果需要使用,就要给出groupId和artifactId,无需给出version
使用是为了统一管理版本信息
在子工程中使用时,还是需要引入坐标的,但是不需要给出version
在我们项目顶层的POM文件中,元素。
通过它元素来管理jar包的版本,
让子项目中引用一个依赖而不用显示的列出版本号。
Maven会沿着父子层次向上找,
直到找到一个拥有dependencyManagement元素的项目,
然后它就会使用在这个dependencyManagement元素中指定的版本号。
required a bean of type 'DeptDao' that could not be found.
使用@Mapper而不是@Repository
1、使用@mapper后,不需要在spring配置中设置扫描地址,通过mapper.xml里面的namespace属性对应相关的mapper类,spring将动态的生成Bean后注入到ServiceImpl中。
2、@repository则需要在Spring中配置扫描包地址,然后生成dao层的bean,之后被注入到ServiceImpl中
Connection refused connect
检查url端口号,是否写对,是否占用
RestTemplate传递对象无法接收(null)
在服务器端对应的参数上添加@RequestBody
@PostMapping("/dev/add")
public boolean addDept(@RequestBody Dept dept){
System.out.println(dept);
return deptimpl.add(dept);
}
来源:https://juejin.cn/post/6949533826339700767#heading-2


猜你喜欢
- 目录1 CyclicBarrier方法说明2 CyclicBarrier实例3 CyclicBarrier源码解析CyclicBarrier
- 本文介绍了SpringBoot结合SpringSecurity实现图形验证码功能,分享给大家,具体如下:生成图形验证码根据随机数生成图片将随
- SpinnerSpinner是一个列表选择框,会在用户选择后,展示一个列表供用户进行选择。Spinner是ViewGroup的间接子类,它和
- 一、前言跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问
- 哎,最近很好久没写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernat
- 主要注意的是在资源引用的地方AlertDialog.Builder(this,R.style.dialogNoBg).create();这里
- 1. 前言ResultSetMetaData 叫元数据,是数据库 列对象,以列为单位封装为对象。元数据,指的是其包含列名,列值,列类型,列长
- 什么是Java类库在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码。比如文件操作,不同程序对文
- ThymeleafThymeleaf是最近SpringBoot推荐支持的模板框架,官网在thymeleaf.org这里。我们为什么要用Thy
- 本文实例讲述了Android开发之绘制平面上的多边形功能。分享给大家供大家参考,具体如下:计算机里的3D图形其实是由很多个平面组合而成的。所
- 本文实例讲述了Android编程简单实现雷达扫描效果。分享给大家供大家参考,具体如下:在eoe看到有一篇关于雷达扫描的文章,然后看了下,很简
- 1. 对象的创建对象创建的主要流程:1.类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引
- 1.后台参数校验Spring Validation验证框架对参数的验证机制提供了@Validated(Spring JSR-303规范,是标
- 案例sql脚本DROP DATABASE IF EXISTS `javacode2018`;CREATE DATABASE `javacod
- 前言可能会涉及到汇编的知识,不过这没有关系,肯定能看懂,看不懂留言,我再做解释。使用到的工具是vs2010。本节只讲继承的特点,公有私有多态
- CSRF介绍CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click atta
- 1. Text日常最常用的应该就是显示文字,所以有必要说一下Text控件。首先源码如下:@Composablefun Text(  
- 由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载。项目使用的Spring+Mybatis+SpringMVC框架,利用
- 一、Druid简介Druid是阿里开源的数据库连接池,作为后起之秀,性能比dbcp、c3p0更高,使用也越来越广泛。当然Druid不仅仅是一
- 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下:在编写WinForm访问WebService时,常会