第三章 SpringCloud简介和服务调用

SpringCloud 是Sping旗下的项目之一,官网:http://projects.spring.io/spring-cloud/

把非常流行的技术整合在一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能,主要涉及组件:

  1. Eureka:注册中心
  2. Zuul:服务网关
  3. Ribbon:负载均衡
  4. Feign:服务调用
  5. Hystrix:熔断器

准备工作:

-- 创建mysql库
create database `test-basedata` default character set utf8mb4 collate utf8mb4_general_ci;

-- 创建数据表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id' ,
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `key_word` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关键词',
  `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别 {男:1,女:2}',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `birthday` date NULL DEFAULT NULL COMMENT '生日',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `content` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '个人简介',
  `create_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改人',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT='测试用户表' AUTO_INCREMENT=1 ROW_FORMAT = Dynamic;

-- 插入数据
INSERT INTO `sys_user` VALUES (1, '校花',  NULL, '2', 18, NULL, NULL, NULL, 'admin', '2019-04-10 11:42:57', NULL, NULL);

服务调用

  1. 创建聚合工程
    File -> new Project->选择maven工程
    groupId:com.sharpnew.demo sharpneqw(开发组,公司名)+项目名称
    artifactId:cloud-demo 项目的唯一标识

父工程引入依赖:
properties: 管理包的属性,可以减少修改

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
    <!--设定一个空值将始终从仓库中获取,不从本地路径获取-->
    <relativePath/>
  </parent>

  <modules>
    <module>user-service</module>
  </modules>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    <mapper.starter.version>2.0.3</mapper.starter.version>
    <mysql.version>5.1.47</mysql.version>
  </properties>

  <!--子工程不继承,如果引用要声明不指定版本,可以使用父工程的版本-->
  <dependencyManagement>
    <dependencies>
      <!--spring-Cloud-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <!--版本管理-->
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <!--scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布-->
        <scope>import</scope>
      </dependency>
      <!--通用的Mapper启动器-->
      <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>${mapper.starter.version}</version>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

2.1. 模拟服务提供 - 调用

  1. 建立子工程 (user-service)
    目录要建立在父工程里面

  2. 配置 application.yml

server:
  port: 8101
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test-basedata
    username: root
    password: XXXX
    driver-class-name: com.mysql.jdbc.Driver
mybatis:
  type-aliases-package: com.sharpnew.user.pojo

3.配置启动类 com.sharpnew.UserApplication

@SpringBootApplication
@MapperScan("com.sharpnew.user.mapper")
public class UserApplication {
  public static void main(String[] args) {
    SpringApplication.run(UserApplication.class);
  }
}
  1. 建立实体类 com.sharpnew.user.pojo
@Table(name = "sys_user")
@Data
public class User {
  @Id
  @KeySql(useGeneratedKeys = true)
  private Long id;
  private String name;//姓名
  private String keyWord;//关键字
  private Integer sex;//性别
  private Integer age;//年龄
  private Date birthday;//生日
  private String email;//邮箱
  private String content;//内容
  private String createBy;//创建人
  private Date createTime;//创建时间
  private String updateBy;//修改人
  private Date updateTime;//修改时间
}
  1. 建立 mapper类 com.sharpnew.user.mapper
public interface UserMapper extends Mapper<User> {
}
  1. 建立服务类 com.sharpnew.user.service.UserService
@Service
public class UserService {
  @Autowired
  private UserMapper userMapper;

  public User queryById(Long id) {
    return userMapper.selectByPrimaryKey(id);
  }
}
  1. 建立controller类 com.sharpnew.user.controller.UserController
@RestController
@RequestMapping("user")
public class UserController {
  @Autowired
  private UserService userService;
  
  @GetMapping("/{id}")
  public User queryById(@PathVariable("id") Long id) {
    return userService.queryById(id);
  }
}

浏览器打开地址:http://localhost:8101/user/1 即可看到结果

调用:

  1. 启动类
@SpringBootApplication
public class ConsumerApplication {
   //将对象交给spring 管理
  @Bean
  public RestTemplate restTemplate() {
    return new RestTemplate();
  }
  public static void main(String[] args) {
    SpringApplication.run(ConsumerApplication.class);
  }
}

2.controller类

@RestController
@RequestMapping("consumer")
public class ConsumerController {
  @Autowired
  private RestTemplate restTemplate;

  @GetMapping("{id}")
  public User queryById(@PathVariable("id") Long id) {
    String url = String.format("http://localhost:8101/user/%s", id);
    System.out.println(url);
    User user = restTemplate.getForObject(url, User.class);
    return user;
  }
}

存在问题:
在consumer中,我们把url写死在代码中,不方便维护
cunsumer需要记忆user-service的地址,如果出现变更,得不到通知,地址会失效
consumer不清楚user-service的状态,服务宕机也不知道
user-service 只有一个服务,不具备高可用性
即使user-service形成集群,consumer还需要自己实现负载均衡

综上所述,引入springCloud,主要解决以下问题:
服务管理
如何自动注册和发现
如何实现状态监管
如何实现动态路由
服务如何实现负载均衡
服务如何解决容灾问题
服务如何实现统一配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值