zoukankan      html  css  js  c++  java
  • SpringCloud入门

    SpringCloud介绍:
    
    1. 什么是微服务?
        微服务架构(Microservice Architecture)是一种架构概念,旨在将功能点进行比较细粒度的拆分,
    拆成一个个可以独立运行和发布部署的独立系统。这些系统我们就称为微服务系统。微服务系统近乎完全解耦。
    
    2. 微服务架构的实现技术:
        dubbo、spring cloud等;
    
    3. spring cloud是什么?
        Spring Boot基于spring,擅长的是集成,把世界上最好的框架集成到自己项目中。而Spring Cloud是基于SpringBoot
    开发而来,SpringCloud是一系列框架的有序集合,是把非常流行的微服务的技术整合到一起,是微服务架构的一站式技术解决方案。
    
    4. spring cloud常用的组件:
        注册中心:Eureka、consul、Zookeeper
        负载均衡:Ribbon
        熔断器:Hystrix
        服务通信:Feign
        网关:Gateway
        配置中心 :config
        消息总线:Bus、集成rabbitmq
        
    5. spring boot和spring cloud的版本要对应。
    
    6. RestTemplate:
        spring家族的RestTemplate,是一种实现系统之间通信的技术。spring cloud支持http协议,而RestTemplate内部封装了http客户端工具,
    所以RestTemplate支持http协议。
        
    7. RestTemplate使用场景演示,微服务中没有消费者和提供者,为了便于理解,这里使用消费者和提供者;
        1.创建provider
            1.pom文件
                <?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.it</groupId>
                    <artifactId>it-restTemplate-provider</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <!--微服务架构中并没有provider和consumer,这里是为了便于理解-->
                    <!--父工程-->
                    <parent>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-parent</artifactId>
                        <version>2.1.4.RELEASE</version>
                    </parent>
    
                    <dependencies>
                        <!--web起步依赖-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-web</artifactId>
                        </dependency>
                        
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-autoconfigure</artifactId>
                        </dependency>
                    </dependencies>
    
    
                </project>
                
            2.启动类:
                package com.it;
    
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                @SpringBootApplication
                public class ProviderApplication {
                    public static void main(String[] args) {
                        SpringApplication.run(ProviderApplication.class,args);
                    }
                }
                
            3. pojo
                package com.it.pojo;
    
                import java.io.Serializable;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                public class User implements Serializable {
                    private Integer id;
                    private String name;
    
                    public Integer getId() {
                        return id;
                    }
    
                    public void setId(Integer id) {
                        this.id = id;
                    }
    
                    public String getName() {
                        return name;
                    }
    
                    public void setName(String name) {
                        this.name = name;
                    }
                }
    
            4. Controller类
                package com.it.controller;
    
                import com.it.pojo.User;
                import org.springframework.web.bind.annotation.PathVariable;
                import org.springframework.web.bind.annotation.RequestMapping;
                import org.springframework.web.bind.annotation.RestController;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                @RestController
                @RequestMapping("/user")
                public class UserController {
    
                    @RequestMapping("/getById/{id}")
                    public User getById(@PathVariable(name = "id") Integer id){
                        User user = new User();
                        user.setId(id);
                        user.setName("东方不败");
                        return user;
    
                    }
                }
            5. 配置文件:无,默认端口8080;
        
        2.创建consumer
        
            1.pom文件
                <?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.it</groupId>
                    <artifactId>it-restTemplate-consumer</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <!--微服务架构中并没有provider和consumer,这里是为了便于理解-->
                    <!--父工程-->
                    <parent>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-parent</artifactId>
                        <version>2.1.4.RELEASE</version>
                    </parent>
    
                    <dependencies>
                        <!--web起步依赖-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-web</artifactId>
                        </dependency>
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-autoconfigure</artifactId>
                        </dependency>
                    </dependencies>
    
    
                </project>
                
            2.启动类:
                package com.it;
    
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
                import org.springframework.context.annotation.Bean;
                import org.springframework.web.client.RestTemplate;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                @SpringBootApplication
                public class ConsumerApplication {
                    public static void main(String[] args) {
                        SpringApplication.run(ConsumerApplication.class,args);
                    }
    
                    @Bean
                    public RestTemplate restTemplate(){
                        return new RestTemplate();
                    }
                }
    
                
            3. pojo
                package com.it.pojo;
    
                import java.io.Serializable;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                public class User implements Serializable {
                    private Integer id;
                    private String name;
    
                    public Integer getId() {
                        return id;
                    }
    
                    public void setId(Integer id) {
                        this.id = id;
                    }
    
                    public String getName() {
                        return name;
                    }
    
                    public void setName(String name) {
                        this.name = name;
                    }
                }
    
            4. Controller类
                package com.it.controller;
    
                import com.it.pojo.User;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.web.bind.annotation.RequestMapping;
                import org.springframework.web.bind.annotation.RestController;
                import org.springframework.web.client.RestTemplate;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/2
                 */
                @RestController
                @RequestMapping("/order")
                public class OrderController {
    
                    @Autowired
                    private RestTemplate restTemplate;
    
                    @RequestMapping("/getInfo")
                    public String getInfo(){
                        //调用provider,获取用户的数据
                        //自动发送请求,并将数据转成pojo
                        User user = restTemplate.getForObject("http://localhost:8080/user/getById/123", User.class);
                        System.out.println(user.getId()+":"+user.getName());
                        System.out.println("获取到了数据。。。。");
                        return "ok";
                    }
                }
    
            5. 配置文件:application.yml
                server:
                    port: 8081
                    
    8. Spring Data JPA:
        spring data jpa是一种持久层技术框架,内部封装了基本的CRUD,使用jpa,不需要写XML文件就可以实现基本的CRUD功能;
        spring data jpa的使用:
            1. 使用注解,使pojo和数据库表建立映射:
                在pojo类上加上如下注解:
                    @Entity:表示这个POJO是和数据库表建立映射的POJO
                    @Table(name = "tb_user"):指定数据库中对应的表,建立映射
                在pojo的属性上加上如下注解:
                    @Id:标记该属性为主键
                    @GeneratedValue(strategy = GenerationType.IDENTITY):标记主键自增策略
                    
                    @Column(name = "username"):建立pojo属性和数据库表中列的映射,若属性名和数据库一致,可以不写
            2. 创建Dao接口继承JpaRepository<>接口:
                如下:
                    User为数据库表对应的pojo;
                    Integer为主键类型;
                    无需写基本的CRUD,因为JpaRepository内部封装了;
                @Repository
                public interface UserDao extends JpaRepository<User,Integer> {
    
                }
                    
    9. 模拟微服务使用场景:微服务中没有消费者和提供者,为了便于理解,这里使用消费者和提供者;
        在上面的RestTemplate的使用中,尽管实现了系统之间的通信,但是实现时,却将URL写死了,这样可扩展性和可维护性都受限,
        因此,类似zookeeper一样,我们使用spring cloud eureka作为注册中心,使用推拉机制实现动态获取IP和端口。
        
        1. 创建父工程parent,用于统一管理springboot和springcloud依赖的版本;
            1. pom文件
                <?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.it</groupId>
                    <artifactId>it-springcloud-parent</artifactId>
                    <version>1.0-SNAPSHOT</version>
                    <description>父工程,管理springboot和springcloud的版本</description>
                    <modules>
                        <module>user-provider</module>
                        <module>user-consumer</module>
                    </modules>
                    <packaging>pom</packaging>
    
                    <parent>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-parent</artifactId>
                        <version>2.1.4.RELEASE</version>
                    </parent>
    
                    <!--SpringCloud包版本依赖管理-->
                    <dependencyManagement>
                        <dependencies>
                            <dependency>
                                <groupId>org.springframework.cloud</groupId>
                                <artifactId>spring-cloud-dependencies</artifactId>
                                <version>Greenwich.SR1</version>
                                <type>pom</type>
                                <scope>import</scope>
                            </dependency>
                        </dependencies>
                    </dependencyManagement>
    
    
                </project>
        
        2. 创建eureka-server作为Eureka的服务端:
            1. pom文件:导入eureka-server依赖
                <?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>it-springcloud-parent</artifactId>
                        <groupId>com.it</groupId>
                        <version>1.0-SNAPSHOT</version>
                    </parent>
                    <modelVersion>4.0.0</modelVersion>
    
                    <artifactId>it-eureka-server</artifactId>
                    <description>eureka服务端</description>
    
                    <dependencies>
                        <!--eureka-server依赖-->
                        <dependency>
                            <groupId>org.springframework.cloud</groupId>
                            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
                        </dependency>
                    </dependencies>
    
    
                </project>
                
            2. 创建启动类,并使用注解@EnableEurekaServer表明这是Eureka的服务端
                package com.it;
    
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
                import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @SpringBootApplication
                @EnableEurekaServer//表明这是Eureka的服务端
                public class EurekaServerApplication {
                    public static void main(String[] args) {
                        SpringApplication.run(EurekaServerApplication.class,args);
                    }
                }
            3. 配置文件:application.yml:
                server:
                  port: 7001
    
                eureka:
                  client:
                    register-with-eureka: false   #是否将自己注册到Eureka中
                    fetch-registry: false   #是否从eureka中获取服务信息
                    service-url:
                      defaultZone: http://localhost:7001/eureka # EurekaServer的注册地址,Eureka的客户端通过改地址进行注册
    
                spring:
                  application:
                    name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
                    
        2. 创建微服务user-provider,为了便于理解,可以理解为服务端:
            1. pom文件:
                <?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>it-springcloud-parent</artifactId>
                        <groupId>com.it</groupId>
                        <version>1.0-SNAPSHOT</version>
                    </parent>
                    <modelVersion>4.0.0</modelVersion>
    
                    <artifactId>user-provider</artifactId>
                    <!--假设该系统为用户系统,提供用户的相关信息-->
                    <dependencies>
                        <!--JPA包-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-data-jpa</artifactId>
                        </dependency>
                        <!--web起步包-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-web</artifactId>
                        </dependency>
                        <!--MySQL驱动包-->
                        <dependency>
                            <groupId>mysql</groupId>
                            <artifactId>mysql-connector-java</artifactId>
                            <scope>runtime</scope>
                        </dependency>
                        <!--测试包-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-test</artifactId>
                            <scope>test</scope>
                        </dependency>
    
                        <!--eureka客户端-->
                        <dependency>
                            <groupId>org.springframework.cloud</groupId>
                            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                        </dependency>
    
                    </dependencies>
    
    
                </project>
                
            2. 创建启动类,并使用注解@EnableEurekaClient表明这是Eureka的客户端
                package com.it;
    
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
                import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @SpringBootApplication
                @EnableEurekaClient//表示该服务是Eureka的客户端
                public class UserProviderApplication {
                    public static void main(String[] args) {
                        SpringApplication.run(UserProviderApplication.class,args);
                    }
                }
            3. 创建pojo并与数据库表建立映射:
                package com.it.pojo;
    
                import javax.persistence.*;
                import java.io.Serializable;
                import java.util.Date;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @Entity//表示这个POJO是和数据库表建立映射的POJO
                @Table(name = "tb_user")//指定数据库中对应的表,建立映射
                public class User implements Serializable {
                    @Id//标记该属性为主键
                    @GeneratedValue(strategy = GenerationType.IDENTITY)//标记主键自增策略
                    private Integer id;//主键id
                    @Column(name = "username")//若属性名和数据库一致,可以不写
                    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;//备注
    
                    public Integer getId() {
                        return id;
                    }
    
                    public void setId(Integer id) {
                        this.id = id;
                    }
    
                    public String getUsername() {
                        return username;
                    }
    
                    public void setUsername(String username) {
                        this.username = username;
                    }
    
                    public String getPassword() {
                        return password;
                    }
    
                    public void setPassword(String password) {
                        this.password = password;
                    }
    
                    public String getName() {
                        return name;
                    }
    
                    public void setName(String name) {
                        this.name = name;
                    }
    
                    public Integer getAge() {
                        return age;
                    }
    
                    public void setAge(Integer age) {
                        this.age = age;
                    }
    
                    public Integer getSex() {
                        return sex;
                    }
    
                    public void setSex(Integer sex) {
                        this.sex = sex;
                    }
    
                    public Date getBirthday() {
                        return birthday;
                    }
    
                    public void setBirthday(Date birthday) {
                        this.birthday = birthday;
                    }
    
                    public Date getCreated() {
                        return created;
                    }
    
                    public void setCreated(Date created) {
                        this.created = created;
                    }
    
                    public Date getUpdated() {
                        return updated;
                    }
    
                    public void setUpdated(Date updated) {
                        this.updated = updated;
                    }
    
                    public String getNote() {
                        return note;
                    }
    
                    public void setNote(String note) {
                        this.note = note;
                    }
                }
    
            4. 创建Controller类:
                package com.it.controller;
    
                import com.it.pojo.User;
                import com.it.service.UserService;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.web.bind.annotation.GetMapping;
                import org.springframework.web.bind.annotation.RequestMapping;
                import org.springframework.web.bind.annotation.RestController;
    
                import java.util.List;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @RestController
                @RequestMapping(value = "/user")
                public class UserController {
    
                    @Autowired
                    private UserService userService;
    
                    @RequestMapping(value = "findAll")
                    public List<User> findAll(){
                        return userService.findAll();
                    }
    
                    @RequestMapping(value = "findByUser")
                    public User findByUser(){
                        return userService.findAll().get(0);
                    }
                }
            5. 创建service接口及实现类:
                接口:
                package com.it.service;
    
                import com.it.pojo.User;
    
                import java.util.List;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                public interface UserService {
                    List<User> findAll();
                }
                
                实现类:
                package com.it.service.impl;
    
                import com.it.dao.UserDao;
                import com.it.pojo.User;
                import com.it.service.UserService;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.stereotype.Service;
    
                import java.util.List;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @Service
                public class UserServiceImpl implements UserService {
    
                    @Autowired
                    private UserDao userDao;
    
                    @Override
                    public List<User> findAll() {
                        return userDao.findAll();
                    }
                }
            6.     创建Dao接口继承JpaRepository
                package com.it.dao;
    
                import com.it.pojo.User;
                import org.springframework.data.jpa.repository.JpaRepository;
                import org.springframework.stereotype.Repository;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @Repository
                public interface UserDao extends JpaRepository<User,Integer> {
    
                }
                
                
        3. 创建微服务user-consumer,为了便于理解,可以理解为消费端:
            1. pom文件:导入eureka-client依赖
                <?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>it-springcloud-parent</artifactId>
                        <groupId>com.it</groupId>
                        <version>1.0-SNAPSHOT</version>
                    </parent>
                    <modelVersion>4.0.0</modelVersion>
    
                    <artifactId>user-consumer</artifactId>
                    <!--假设该系统为电影微服务系统,需要获取用户信息-->
                    <dependencies>
                        <!--web起步包-->
                        <dependency>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-web</artifactId>
                        </dependency>
    
                        <!--eureka客户端-->
                        <dependency>
                            <groupId>org.springframework.cloud</groupId>
                            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                        </dependency>
    
                    </dependencies>
    
    
                </project>
            2. 创建启动类,并使用注解@EnableEurekaClient表明这是Eureka的客户端
                package com.it;
    
                import org.springframework.boot.SpringApplication;
                import org.springframework.boot.autoconfigure.SpringBootApplication;
                import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
                import org.springframework.context.annotation.Bean;
                import org.springframework.web.client.RestTemplate;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @SpringBootApplication
                @EnableEurekaClient
                public class UserConsumerApplication {
                    public static void main(String[] args) {
                        SpringApplication.run(UserConsumerApplication.class,args);
                    }
    
                    @Bean
                    public RestTemplate restTemplate(){
                        return new RestTemplate();
                    }
    
                }
            3. 配置文件:application.yml
                server:
                  port: 18082
                spring:
                  application:
                    name: user-consumer
                eureka:
                  client:
                    register-with-eureka: true   #是否将自己注册到Eureka中,可以不配,默认为true
                    fetch-registry: true   #是否从eureka中获取服务信息,可以不配,默认为true
                    service-url:
                      defaultZone: http://localhost:7001/eureka # 注册到EurekaServer端的地址
            4. 创建Controller类:向微服务user-provider发送请求,获取user-provider查询到的信息:
                package com.it.controller;
    
                import com.it.pojo.User;
                import org.springframework.beans.factory.annotation.Autowired;
                import org.springframework.cloud.client.ServiceInstance;
                import org.springframework.cloud.client.discovery.DiscoveryClient;
                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;
    
                import java.util.List;
    
                /**
                 * ToDo
                 *
                 * @author Lyle
                 * @date 2020/4/3
                 */
                @RestController
                @RequestMapping("/movie")
                public class MovieController {
    
                    @Autowired
                    private RestTemplate restTemplate;
    
                    @Autowired
                    private DiscoveryClient discoveryClient;
    
                    @RequestMapping("/look/{username}")
                    public String look(@PathVariable(name = "username") String username){
                        //接收用户信息
                       // User user = restTemplate.getForObject("http://localhost:18081/user/findByUser", User.class);
                        List<ServiceInstance> instances = discoveryClient.getInstances("user-provider");
                        ServiceInstance serviceInstance = instances.get(0);
                        User user = restTemplate.getForObject("http://"
                                +serviceInstance.getHost()+":"+serviceInstance.getPort()
                                +"/user/findByUser", User.class);
                        System.out.println(username+"===========>"+user.getName());
                        return "success";
                    }
                }
    
            
    
            
    
    
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
    
        
  • 相关阅读:
    Android学习之adb异常处理
    Android学习之多触点滑动
    RN animated帧动画
    RN animated组动画
    RN animated缩放动画
    RN Animated透明度动画
    Eclipse ADT中的logcat不显示解决方法
    RadioButton使用
    PropTypes使用
    SegmentedControlIOS使用
  • 原文地址:https://www.cnblogs.com/lyle-liu/p/12627955.html
Copyright © 2011-2022 走看看