Java 微服务之 SpringCloud快速入门day01 (二)初始SpringCloud

Java 微服务之 SpringCloud快速入门day01 (一)系统架构的演变,服务调用方式
Java 微服务之 SpringCloud快速入门day01 (二)初始SpringCloud
Java 微服务之 SpringCloud快速入门day01 (三)Eureka注册中心快速入门
Java 微服务之 SpringCloud快速入门day01 (四)Eureka注册中心高级部分(集群)(高可用)
Java 微服务之 SpringCloud快速入门day02 (一)Hystrix 线程隔离,服务降级
Java 微服务之 SpringCloud快速入门day02 (二)Feign
Java 微服务之 SpringCloud快速入门day02 (三)Zuul网关,面向服务的路由,Zuul过滤器

一、SpringCloud的简介

微服务是一种架构方式,最终肯定需要技术架构去实施。
微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?

  • 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
  • 技术强: Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了
  • 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
  • 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建

SpringCloud快速入门:

SpringCloud的官网:

https://spring.io/projects/spring-cloud

在这里插入图片描述
SpringCloud的版本
在这里插入图片描述
SpringCloud是Spring旗下的项目之一,

最擅长的就是集成,把世界上最好的框架拿过来,集成到自己的项目中。

SpringCloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。

其主要涉及的组件包括:

Netflix

  • Eureka:注册中心
  • zuul:服务网关
  • Ribbon:负载均衡
  • Feign:服务调用
  • Hystix:熔断器

以上只是其中一部分,架构图:

二、微服务场景模拟

首先,我们需要模拟一个服务调用的场景。方便后面学习微服务框架。

1、创建父工程

微服务中需要同时创建多个项目,为了方便课堂演示,我们先创建一个父工程,然后后续的工程都以这个工程为父,实现maven的聚合。这样可以在一个窗口看到所有工程,方便我们讲解。

在实际开发中,应该是每个微服务独立一个工程。

(1)创建cloud-demo

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)修改pom.xml

在这里插入图片描述

<?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.itzheng.demo</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <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>Finchley.SR1</spring-cloud.version>
        <mapper.starter.version>2.0.3</mapper.starter.version>
        <mysql.version>5.1.32</mysql.version>
        <pageHelper.starter.version>1.2.5</pageHelper.starter.version>
    </properties>

    <dependencyManagement>

        <dependencies>
            <!--springCloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
            </dependency>
            <!--通用Mapper启动器-->
            <dependency>
                <groupId>tk.mapper</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>${mapper.starter.version}</version>
            </dependency>
            <!--mysql驱动-->
            <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>


</project>
2、创建服务提供者

我们新建一个项目,对外提供查询用户的服务

(1)创建module

选中父工程:cloud-demo
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)完善pom.xml

在这里插入图片描述

<?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>cloud-demo</artifactId>
        <groupId>com.itzheng.demo</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>user-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.3</version>
        </dependency>
    </dependencies>
</project>
3、创建服务提供者:编写代码
(1)属性文件:这里我们采用了yaml语法,而不是properties

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

server:
  port: 8082
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/itzheng
    username: root
    password: root
mybatis:
  type-aliases-package: com.itzheng.user.pojo
(2)创建对应的包结构

在这里插入图片描述

(3)创建启动类

在这里插入图片描述

在这里插入图片描述

package com.itzheng;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.itzheng.user.mapper")
public class UserApplication {



}

(4)创建com.itzheng.user.mapper包

在这里插入图片描述

(5)完善UserApplication类

在这里插入图片描述


package com.itzheng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.itzheng.user.mapper")
public class UserApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class);
    }

}
(6)创建User实体类

在这里插入图片描述

在这里插入图片描述

package com.itzheng.user.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Table(name="tb_user")
@Data
public class User {

    @Id
    @KeySql(useGeneratedKeys = true)
    private Long id;

    private String userName;  //用户名

    private String password; //密码

    private String name; //姓名

    private Integer age; //年龄

    private Integer sex; //性别、1:男鞋 2:女性

    private Date birthday; //出生日期

    private Date created;  //创建时间

    private Date updated;  //更新时间

    private String note; //备注

}

(7)引入插件

在这里插入图片描述
在这里插入图片描述

(8)创建通用Mapper即UserMapper继承Mapper

在这里插入图片描述

package com.itzheng.user.mapper;

import com.itzheng.user.pojo.User;
import tk.mybatis.mapper.common.Mapper;

public interface UserMapper extends Mapper<User> {



}

(9)创建Service。创建UserService

在这里插入图片描述
在这里插入图片描述

package com.itzheng.user.Service;

import com.itzheng.user.mapper.UserMapper;
import com.itzheng.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id) {

        return userMapper.selectByPrimaryKey(id);
    }

}

(10)增加一个对外查询的接口:

在这里插入图片描述
在这里插入图片描述

package com.itzheng.user.web;

import com.itzheng.user.Service.UserService;
import com.itzheng.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id){
        return userService.queryById(id);
    }
}
(11)运行测试项目

在这里插入图片描述
访问项目:http://localhost:8082/user/8
在这里插入图片描述

{
	"id":8,
	"userName":"zhangsan",
	"password":"123",
	"name":"zhangsan123",
	"age":12,
	"sex":1,
	"birthday":"2021-06-13T16:00:00.000+0000",
	"created":"2021-06-29T10:21:50.000+0000",
	"updated":"2021-06-30T10:21:53.000+0000",
	"note":"1"
}
4、服务的调用放:代码编写
(1)创建项目工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)在pom.xml当中添加启动器

在这里插入图片描述

<?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>cloud-demo</artifactId>
        <groupId>com.itzheng.demo</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer-demo</artifactId>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

</project>
(3)编写启动类

在这里插入图片描述
在这里插入图片描述

package com.itzheng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ConsumerApplication {
    @Bean
    public RestTemplate restTemplate(){

        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }

}

(4)编写实体类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itzheng.consumer.web;

import com.itzheng.consumer.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/{id}")
    public User queryById(@PathVariable("id") Long id ){
        String url = "http://localhost:8082/user/"+id;
        User user = restTemplate.getForObject(url,User.class);
        return user;
    }

}

(5)打开Run Dashboard

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(6)Run Dashboard启动两个项目,并访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
http://localhost:8080/consumer/8

在这里插入图片描述

consumer-demo项目访问了user-service项目
在这里插入图片描述

5、有没有问题?

简单回顾一下,刚才我们写了什么∶

user-service:对外提供了查询用户的接口

consumer:通过RestTemplate访问http://locahost:8082/user/{id)接口,查询用户数据

存在什么问题

  • 在consumer中,我们把url地址硬编码到了代码中,不方使后期维护

  • consumer需要记忆user-service的地址,如果出现变更,可能得不到通知,地址将失效

  • consumer不清楚user-service的状态,服务宕机也不知道

  • user-service只有1台服务,不具备高可用性

  • 即便user-service形成集群,consumer还需自己实现负载均衡

其实上面说的问题,概括一下就是分布式服务必然要面临的问题:
服务管理

  • 如何自动注册和发现。如何实现状态监管如何实现动态路由服务如何实现负载均衡服务
  • 如何解决容灾问题·服务如何实现统一配置

以上的问题,我们都将在SpringCloud中得到答案。

Java 微服务之 SpringCloud快速入门day01 (一)系统架构的演变,服务调用方式
Java 微服务之 SpringCloud快速入门day01 (二)初始SpringCloud
Java 微服务之 SpringCloud快速入门day01 (三)Eureka注册中心快速入门
Java 微服务之 SpringCloud快速入门day01 (四)Eureka注册中心高级部分(集群)(高可用)
Java 微服务之 SpringCloud快速入门day02 (一)Hystrix 线程隔离,服务降级
Java 微服务之 SpringCloud快速入门day02 (二)Feign
Java 微服务之 SpringCloud快速入门day02 (三)Zuul网关,面向服务的路由,Zuul过滤器
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值