springcloudalibb框架和搭建
1、springcloudalibb框架
Spring Cloud Alibaba其实是
阿里的微服务解决方案
,是阿里巴巴结合自身微服务实践,开源的微服务全家桶。
常用组件:
Zuul: 做服务网关,它是整个微服务的大门,可以用来实现登录、权限检查等业务。
Eureka: 做服务注册与发现,用来解决服务之间通信问题。
Ribbon/OpenFeign:用做客户端的负载均衡,也就是解决将请求路由到微服务集群的问题 。
Hystrix:断路器,它的熔断、降级策略用来解决单节点故障 。
Config:分布式配置中心,用来统一管理配置所有微服务的配置文件 。
Bus:消息总线,用来给各个微服务广播消息,可以实现各个微服务配置的自动刷新 。
Sleuth:链路追踪,用来实时监控各个微服务建的调用关系,快速定位故障节点 。
2、 springcloudalibb框架搭建原理:
案列:
1、父子项目搭建spring-cloud-alibaba-test:
1.1、导包:
<!--父项目--> <packaging>pom</packaging> <!--管理springboot依赖--> <parent> <groupId> org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> </parent> <!--SpringCloud依赖和SpringCloudAlibaba依赖--> <dependencyManagement> <dependencies> <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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--公共类--> <dependencies> <!--测试类--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <!--log4j提供了方法使我们能将日志信息分级存储--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <!--data用--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>1.2、子项目:
spring-cloud-alibaba-store
spring-cloud-alibaba-product
spring-cloud-alibaba-common-store
spring-cloud-alibaba-gateway
2、spring-cloud-alibaba-gateway网关服务搭建:
2.1导包:
<dependencies> <!--服务网关,为了处理每个服务都要做的事情。你可以认为是切面变成了服务--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--服务注册--> <dependency> <groupId>com.alibaba.cloud </groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--配置中心客户端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--Gateway聚合Swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies>2.2、启动类配置:
package com.jd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; //注册客户端 public class GatewayStarter { public static void main(String[] args) { SpringApplication.run(GatewayStarter.class); } }2.3、xml注册 :
application.xml配置:可以配远程或本地自己选择
server: port: 10010 spring: application: name: service-gateway #服务名 cloud: #注册到Nacos nacos: discovery: server-addr: 127.0.0.1:8848 gateway: discovery: locator: enabled: false #开放服务名访问方式 lower-case-service-id: true #服务名小写 routes: #路由配置 - id : application-product #指定服务名 uri: lb://service-product #去注册中心找这个服务名 predicates: #断言,匹配访问的路径 - Path=/product/** #服务访问路径 filters: - StripPrefix=1 - id: application-store #指定服务名 uri: lb://service-store #去注册中心找这个服务名 predicates: #断言,匹配访问的路径 - Path=/store/** #服务访问路径 filters: - StripPrefix=1 globalcors: #跨域配置 cors-configurations: '[/**]': allowedOrigins: "*" allow-credentials: true allowed-headers: "*" allowedMethods: - GET - POST - DELETE - PUT - PATCH - OPTIONS - HEAD - CONNECT - TRACE #允许Bean覆盖 main: allow-bean-definition-overriding: truebootstrap.xml配置 :
server: port: 10010 spring: profiles: active: dev application: name: product-gateway cloud: nacos: discovery: server-addr: localhost:8848 #注册中心 config: server-addr: localhost:8848 #配置中心 file-extension: yaml #配置文件格式 prefix: application-gateway #配置前缀 ,默认使用sring.application.name group: DEFAULT_GROUP #默认分组 namespace: b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID
3、 spring-cloud-alibaba-store库存模块:
3.1 pom:
<dependencies> <!--springbootnacos依赖--> <dependency> <groupId>com.alibaba.cloud </groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--加入WEB依赖是为了方便后面写Controller--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 配置中心客户端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--客户端接入导入sentinel依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--Sentinel和Nacos做持久的--> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.5.2</version> </dependency> <!-- <!–,在SpringBoot启动时,去扫描所有Mapper接口,然后为其增加一个代理实现类,在调用的过程中,--> <!--我们实际调用的是这个代理对象 可以写,可以写在父类,建议写在当前子类–>--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!-- <!–连接数据库 可以写,可以写在父类,建议写在当前子类 注意版本号 –>--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <!--jdbc连接配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!--公共依赖--> <dependency> <groupId>com.jd</groupId> <artifactId>spring-cloud-alibaba-common-store</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--导入openfeign包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--Feign整合Sentinel熔断--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--引入swagger支持--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!--引入swagger支持--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies>3.2 启动类基础:
package com.jd; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; //注册客户端 public class StoreStarter { public static void main(String[] args) { SpringApplication.run(StoreStarter.class); } }3.3 yml:
application:
#端口号 server: port: 10030 spring: #服务名 application: name: service-store cloud: nacos: server-addr: 127.0.0.1:8848 #注册中心地址 #Sentinel 依赖 sentinel: transport: dashboard: localhost:1111 #连接数据库 datasource: url: jdbc:mysql://localhost:3306/jd-store?serverTimezone=GMT+8&characterEncoding=utf-8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: java # 配置别名 mybatis: type-aliases-package: com.jd.domain #配置sentinel:熔断 feign: sentinel: enabled: true #熔断 #测试用的,不用管 temp: notify: 2222bootstrap.yml:
server: port: 10010 spring: profiles: active: dev application: name: store-server cloud: nacos: discovery: server-addr: localhost:8848 #注册中心 config: server-addr: localhost:8848 #配置中心 file-extension: yaml #配置文件格式 prefix: application-store #配置前缀 ,默认使用sring.application.name group: DEFAULT_GROUP #默认分组 namespace: b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID3.4 xml:
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jd.mapper.StoreMapper"> <!-- Store findOneByStore(Long id) ;;--> <select id="findOneByStore" resultType="com.jd.domain.Store"> select * from t_store where id = #{id}; </select> <!--保存对象--> <!-- void insert(Store store);--> <insert id="insert" parameterType="com.jd.domain.Store"> insert into t_store( productId, number ) values( #{productId}, #{number}) </insert> </mapper>3.5 controller:
package com.jd.controller; import com.jd.domain.Store; import com.jd.feigh.ProductFeign; import com.jd.server.IStoreServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; public class StoreController { private IStoreServer storeServer; private ProductFeign productFeign; public Store findOneByStore({ Long id) Store store = storeServer.findOneByStore(id); return store; } public void insert({ Store store) storeServer.insert(store); } public void insertNumber({ Store store) Integer id = productFeign.insert(store.getProduct()); store.setId(id); storeServer.insert(store); } }4、其他server 、domain mapper省略
4、spring-cloud-alibaba-product 商品模块:
1、基础依赖:
<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-alibaba-test</artifactId> <groupId>com.jd</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>spring-cloud-alibaba-product</artifactId> <dependencies> <!--springbootnacos依赖--> <dependency> <groupId>com.alibaba.cloud </groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--加入WEB依赖是为了方便后面写Controller--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 配置中心客户端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- <!–客户端接入导入sentinel依赖–>--> <!-- <dependency>--> <!-- <groupId>com.alibaba.cloud</groupId>--> <!-- <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>--> <!-- </dependency>--> <!-- <!–Sentinel和Nacos做持久的–>--> <!-- <dependency>--> <!-- <groupId>com.alibaba.csp</groupId>--> <!-- <artifactId>sentinel-datasource-nacos</artifactId>--> <!-- <version>1.5.2</version>--> <!-- </dependency>--> <!--,在SpringBoot启动时,去扫描所有Mapper接口,然后为其增加一个代理实现类,在调用的过程中, 我们实际调用的是这个代理对象 可以写,可以写在父类,建议写在当前子类--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--连接数据库 可以写,可以写在父类,建议写在当前子类 注意版本号 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!--导入openfeign包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--Feign整合Sentinel熔断--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <!--公共依赖--> <dependency> <groupId>com.jd</groupId> <artifactId>spring-cloud-alibaba-common-store</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--引入swagger支持--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies> </project>2、启动类:
package com.jd; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; //注册客户端 public class ProductStarter { public static void main(String[] args) { SpringApplication.run(ProductStarter.class); } }3、yaml:
application.yaml:
#端口号 server: port: 10020 spring: main: allow-bean-definition-overriding: true #服务名 application: name: service-product cloud: nacos: server-addr: 127.0.0.1:8848 #注册中心地址 #Sentinel 依赖 sentinel: transport: dashboard: localhost:1111 #连接数据库 datasource: url: jdbc:mysql://localhost:3306/jd-product?serverTimezone=GMT+8&characterEncoding=utf-8&useSSL=false driver-class-name: com.mysql.cj.jdbc.Driver username: root password: java # 配置别名 mybatis: type-aliases-package: com.jd.domain #配置sentinel:熔断 feign: sentinel: enabled: true #熔断 #测试用的,不用管 temp: notify: 2222bootstrap.yml:
server: port: 10020 spring: profiles: active: dev application: name: product-server cloud: nacos: discovery: server-addr: localhost:8848 #注册中心 config: server-addr: localhost:8848 #配置中心 file-extension: yaml #配置文件格式 prefix: application-product #配置前缀 ,默认使用sring.application.name group: DEFAULT_GROUP #默认分组 namespace: b18ab1b5-485a-4d43-a4ff-fe7da3488dbb #命名空间的ID4、xm:
ProductMapper.xml:
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jd.mapper.ProductMapper"> <!-- Product findOneByProduct(Long id)--> <select id="findOneByProduct" resultMap="ProductMap"> select p.*,s.id cid,s.number from `jd-product`.t_product p left join `jd-store`.t_store s on p.id = s.productId where p.id = #{id} </select> <resultMap id="ProductMap" type="com.jd.domain.Product"> <id column="id" property="id" /> <result column="name" property="name"/> <result column="price" property="price"/> <!-- private Store store;;--> <association property="store" javaType="com.jd.domain.Store"> <id column="cid" property="id" /> <result column="number" property="number"/> </association> </resultMap> <!--保存对象--> <!-- Product insert(Product product);;--> <insert id="insert" parameterType="com.jd.domain.Product" > insert into t_product( name, price ) values( #{name}, #{price}) </insert> <!-- <insert id="insert" parameterType="com.jd.domain.Product">--> <!-- <!–AFTER :insert 先执行. –>--> <!-- <selectKey order="AFTER" keyProperty="id" resultType="int">--> <!-- <!– 获取最后一次执行insert语句的 key –>--> <!-- select LAST_INSERT_ID()--> <!-- </selectKey>--> <!-- insert into `jd-store`.t_store(id, name, gender, birthday, phone, idCard)--> <!-- values(#{id}, #{name}, #{gender},#{birthday},#{phone},#{idcard})--> <!-- </insert>--> <!-- <!–删除对象–>--> <!-- <delete id="delete" parameterType="long">--> <!-- delete from t_user where id = #{id}--> <!-- </delete>--> <!-- <!–更新对象–>--> <!-- <update id="update" parameterType="User">--> <!-- update t_user--> <!-- set--> <!-- username = #{username},--> <!-- phone = #{phone},--> <!-- email = #{email},--> <!-- salt = #{salt},--> <!-- password = #{password},--> <!-- state = #{state},--> <!-- age = #{age},--> <!-- createtime = #{createtime},--> <!-- headImg = #{headImg},--> <!-- logininfo_id = #{logininfoId} where id = #{id}--> <!-- </update>--> </mapper>5、controller:
package com.jd.controller; import com.jd.domain.Product; import com.jd.domain.Store; import com.jd.feigh.StoreFeign; import com.jd.feigh.StoreInsertFeign; import com.jd.server.IProductServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; public class ProductController { private IProductServer productServer; private StoreFeign storeFeign; private StoreInsertFeign storeInsertFeign; public Product findOneByStore({ Long id) Product product = productServer.findOneByProduct(id); Store oneByStore = storeFeign.findOneByStore(id); product.setStore(oneByStore); return product; } public void insert({ Product product ) productServer.insert(product); Integer productId = product.getId(); Integer number = product.getNumber(); Store store = new Store(); store.setProductId(productId); store.setNumber(number); storeInsertFeign.insert(store); } }
对于服务之间的调用当然是通过rpc调用,要比我们自己手动拼接url的好:
Spring Cloud Alibaba整合了Feign,使用Fegin实现服务之间的调用,默认集成Ribbon,可以实现负载均衡。
什么是Feign
Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。Feign提供了HTTP请求的模板,
通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息
。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。同时Feign整合了Hystrix,可以很容易的实现服务熔断和降级 。
Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Fegin默认实现负载均衡的效果。
Fegin原理:
本项目实战为例带你快速了解Fegin基本使用:
分析需求:需要通过Feign调用库存服务把商品的数量保存到库存表。
1、导包:
<!--导入openfeign包--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--Feign整合Sentinel熔断--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>2、启动类加上:
开启fegin客户端
@EnableFeignClients
3、构建一个Fegin类
package com.jd.feigh; import com.jd.domain.Store; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; public interface StoreInsertFeign { void insert(; Store store) }4、降级处理:
package com.jd.feigh; import com.jd.domain.Store; import feign.hystrix.FallbackFactory; import org.springframework.stereotype.Component; public class ProductFeignStoreFactoryInsert implements FallbackFactory<StoreInsertFeign> { public StoreInsertFeign create(Throwable e) { return new StoreInsertFeign() { public void insert(Store store) { e.printStackTrace(); System.out.println(new Store(-1,-2,-3,null)); } }; } }4、业务代码思路:在商品构建一个 number字段接受前段参数,以商品id为productId保存到库存中,这样两个表添加时,使用一个id。(由于业务很少,就在Controller处理结果,本文章主要带大家了解springcloudalibb微服务代建以及Fegin基本使用)
代码:
public void insert({ Product product ) productServer.insert(product); Integer productId = product.getId(); Integer number = product.getNumber(); Store store = new Store(); store.setProductId(productId); store.setNumber(number); storeInsertFeign.insert(store); }
注意事项:Feign接口的参数是一个对象的时候需要使用:@RequestBody 标签
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbhaef
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01