技术标签: 微服务 java spring cloud 框架
springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降级,服务消息队列,配置中心管理,服务网关,服务监控,全链路追踪,自动化部署。
现在我们常用的五大组件
优点
缺点
首先创建父工程(maven),然后添加依赖
<?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.kuang</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.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--SpringBoot 启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.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>
(封装的整体entity/接口/公共配置等)
导入依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
创建实体类:
//链式写法
@Accessors(chain = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
/**
* Dept 实体类 orm 类表关系映射
*/
public class Dept implements Serializable {
/**
* 主键
*/
private Long deptno;
private String dname;
/**
* 这个数据存在哪个数据库字段~微服务,一个服务对应一个数据库,同一个信息可能存在不同数据库
*/
private String db_source;
/*
* 链式写法:
* Dept dept = new Dept();
* dept.setDeptNo(11).setDname('sss').setDb_source('001');
*
* */
}
服务提供者相当于服务端
创建创建springcloud-provider-dep-8001
然后导入依赖
<dependencies>
<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
<groupId>com.kuang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--junit-->
<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>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty:尝试着用这个当应用服务器,与Tomcat没什么区别-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
然后编写一些配置类:
application.yml文件
server:
port: 8001
#mybatis配置
mybatis:
# 配置别名
type-aliases-package: com.yang.springcloud.pojo
# mybatis的配置文件
config-location: classpath:mybatis/mybatis-config.xml
# 编写sql语句的配置文件
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
# 服务的名称
name: springcloud-provider-dept
# 数据源的配置
datasource:
type: com.alibaba.druid.pool.DruidDataSourceC3P0Adapter
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&characterEncoding=UTF-8
username: root
password: ***
mybatis的配置文件mybatis-config.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>
dao层:
@Mapper
@Repository
public interface DeptDao {
/**
* 插入数据
* @param dept 部门对象
* @return 返回是否插入成功
*/
public boolean addDept(Dept dept);
/**
* 根据id查询部门信息
* @param id 部门id
* @return 返回部门对象
*/
public Dept queryById(Long id);
/**
* 查询所有的部门信息
* @return 返回部门信息组成的列表
*/
public List<Dept> queryAll();
}
mapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.springcloud.dao.DeptDao">
<insert id="addDept" parameterType="com.kuang.springcloud.pojo.Dept">
insert into dept (dname,db_source)
values (#{dname},DATABASE());
</insert>
<select id="queryById" resultType="com.kuang.springcloud.pojo.Dept">
select *
from dept
where deptno = #{deptno};
</select>
<select id="queryAll" resultType="com.kuang.springcloud.pojo.Dept">
select * from dept;
</select>
</mapper>
service层:
public interface DeptService {
/**
* 插入数据
* @param dept 部门对象
* @return 返回是否插入成功
*/
public boolean addDept(Dept dept);
/**
* 根据id查询部门信息
* @param id 部门id
* @return 返回部门对象
*/
public Dept queryById(Long id);
/**
* 查询所有的部门信息
* @return 返回部门信息组成的列表
*/
public List<Dept> queryAll();
}
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao deptDao;
@Override
public boolean addDept(Dept dept) {
return deptDao.addDept(dept);
}
@Override
public Dept queryById(Long id) {
return deptDao.queryById(id);
}
@Override
public List<Dept> queryAll() {
return deptDao.queryAll();
}
}
controller层:
//提供Restful服务
@RestController
public class DeptController {
@Autowired
private DeptService deptService;
@PostMapping("/dept/add")
public boolean addDept( Dept dept){
return deptService.addDept(dept);
}
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long id){
return deptService.queryById(id);
}
@GetMapping("/dept/list")
public List<Dept> queryAll(){
return deptService.queryAll();
}
}
编写主启动类:
@SpringBootApplication
public class DeptProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(DeptProvider_8001.class,args);
}
}
然后启动主启动类进行测试:访问http://localhost:8001/dept/list
出现下面的示例表示服务提供者创建成功
创建springcloud-consumer-dept-80
导入依赖:
<dependencies>
<dependency>
<groupId>com.kuang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写yaml文件
server:
port: 80
创建消费者的bean
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
编写服务消费者的controller
@RestController
public class DeptConsumerController {
/**
* 理解:消费者,不应该有service层
* RestTemplate ... 供我们直接调用就可以了!
* (url,实体:map,Class<T> responseType)
*/
/**
* 提供多种便捷访问远程http服务的方法,简单的Restful服务模板~
*/
@Autowired
private RestTemplate restTemplate;
private static final String REST_URL_PREFIX = "http://localhost:8001";
@RequestMapping("/customer/dept/add")
public boolean add(@RequestBody Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
}
@RequestMapping("/customer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
}
@RequestMapping("/customer/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);
}
}
然后分别启动服务生产者和服务消费者来进行测试:http://localhost/customer/dept/list
出现下面的页面说明创建成功:
这个时候我们明明访问的是服务消费者,但是我们依然是可以到达服务消费者的页面,这个就显示了服务的调用
上述资料参考了狂神的springcloud视频
文章浏览阅读241次。_协变张量
文章浏览阅读2.1k次,点赞2次,收藏9次。Matlab在概率统计中的应用(0001)问题:假设已知 Rayleigh 分布的概率密度函数为试用解析推导的方法求出该分布的分布函数、均值、方差、中心矩和原点矩。生成一组满足 Rayleigh 分布的伪随机数,用数值方法检验得出的解析结果是否正确。解:工具相应的数学定义的公式,所需的分布函数、均值、方差、中心矩和原点矩等可 以由下面的语句推导出来。>> syms x;syms b positivep=x*exp(-x^2/2/b^2)/b^..._matlab数学建模 概率题
文章浏览阅读509次。在实际开发中,系统的原生控件并不能满足我们的需求,这个时候就需要自己去自定义这个控件,自定义控件需要自己对原生控件结构非常了解。今天,这里来讲一下不同寻常的tabBar。原则:尽量利用系统自带的TabBar.只改需要改的地方不同寻常的tabBar 类型一:这种基本上是重写了整个tabbar,然后根据自己的需求来定义view的风格 步骤: 1.把自带的TaBBar条给隐藏掉,添加自己的view l_手机app的tabbar能不能占比区域不同
文章浏览阅读1.3k次,点赞4次,收藏2次。第一次使用pygame写游戏时,我创立窗口的时候遇到了这样的困难。首先给出我出现卡顿原因的代码:import pygamedef main(): screen = pygame.display.set_mode((350, 500), depth=32) background = pygame.image.load('/Users/chenyang0804/Desktop/屏幕快照 2020-08-17 下午8.54.21.png') pygame.display.set_ca_pycharm的pygame.display.set_mode很卡怎么办?
文章浏览阅读2.2k次。【Unity】Unity Editor中使输入框失去焦点Unity自定义编辑器窗口时,如果想让当前正在输入文本的输入框失去焦点,必须把焦点移动到另一个输入控件。如果用代码使当前输入框失去焦点的话,很简单,就一行代码:GUIUtility.keyboardControl = 0;..._guiutility.keyboardcontrol
文章浏览阅读1.4k次。关于Linux内核月报Linux阅码场Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向。限于篇幅,只会对..._memory tag
文章浏览阅读3.1w次。kill -SIGTERM关闭worker进程后,会重新起一个worker进程. 该命令是worker提供给master的,通常管理员只需要操作master进程就可以,如果一定要操作worker进程,那么一定是可以确认某一个worker进程出问题了,且信号对应的功能可以解决该问题。Nginx 期望一个worker进程使用一颗cpu, 把某个worker进程和某个cpu绑定在一起,可以更好地使用cpu上的缓存,来减少缓存失效的命中率。Worker进程 处理请求, Master进程管理Worker进程。_nginx master process
文章浏览阅读2.6k次,点赞20次,收藏27次。详细讲解优化的原理,并给出通俗的证明和简单的代码帮助你彻底掌握优化过程!!_最长上升子序列优化
文章浏览阅读3.5k次,点赞4次,收藏22次。项目场景:提示:这里简述项目相关背景:AttributeError: module ‘tensorflow.compat.v1’ has no attribute ‘contrib’问题描述提示:这里描述项目中遇到的问题:公司的是3080显卡,跑tensorflow1.x的代码,最终的环境时tensorflow2.6的,运行会报这个错原因分析:提示:这里填写问题的分析:原因是tensorflow1.x的contrib包被整合进了三个包里(据这位大佬说:https://blog.csd_attributeerror: module 'tensorflow' has no attribute 'contrib
文章浏览阅读3.4w次,点赞12次,收藏99次。CMS接口开发1 项目的功能构架1.1 项目背景1.2 功能模块1.3 项目原型2 项目的技术架构2.1技术架构2.2 技术栈2.3 开发步骤3 CMS需求分析3.1 什么是CMS3.2 静态门户工程搭建3.2.1 导入门户工程3.2.2 配置虚拟主机 在nginx中配置虚拟主机:3.2.3 SSI服务端包含技术3.3 CMS页面管理需求4 CMS服务端工程搭建注释也是必不可少的KaTeX数学公..._学成在线项目怎么写成简历
文章浏览阅读488次。【代码】使用指针实现字符串拷贝。_字符指针拷贝
文章浏览阅读502次。Qt自定义控件8:波浪进度条1先看效果图:思路:利用QPaintPath画出封闭路径,填充颜色,圆弧使用正弦函数,根据横坐标递增,画出正弦函数线。关键代码:void WaterProgressBar1::paintEvent(QPaintEvent *event){ int width = this->width(); int height = this->h..._qt 波浪进度球