springCloud实现服务提供者和消费者之间正常访问

1.新建一个新的maven项目

总项目的pom文件


        <groupId>com.kuang</groupId>
        <artifactId>springCloud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>springCloud-api</module>
            <module>springCloud-provider-dept-7001</module>
            <module>springCloud-customer-80</module>
        </modules>
        <properties>
            <junit-version>4.12</junit-version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    <!--打包方式-->
        <packaging>pom</packaging>
        <!--管理标签-->
    <dependencyManagement>
        <dependencies>
            <!--导入 springCloud的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--导入springBoot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.25</version>
            </dependency>
             <!--数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.11</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit-version}</version>
                <scope>test</scope>
            </dependency>
            <!--springboot启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.2</version>
            </dependency>
            <!--lombok 简化实体类-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.24</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.11</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

注意:不同的springCloud版本,必须和对应的springBoot
版本相对应:参考https://blog.csdn.net/qq_36050986/article/details/124983325
2.新建一个新的model项目(maven普通项目)实体类包

    <properties>
<maven.compiler.source>8</maven.compiler.source>
 <maven.compiler.target>8</maven.compiler.target>
    </properties>
<dependencies>
    <!--当前module用到的依赖,如父依赖已有,则不需要版本-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
</dependencies>

在该项目中新建实体类

/**注意:当我们没有指定构造器时,Java 编译器会帮我们自动生成一个没有任何参数的构造器
给该类,但是如果我们自己写了构造器之后,Java 就不会自动帮我们补上那个无参数的构造器
了,然而很多地方(像是 Spring Data JPA),会需要每个类都一定要有一个无参数的构造
器,所以在加上 @AllArgsConstructor 时,一定要补上 @NoArgsConstrcutor,不然会出
现问题。*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)//链式写法,可以连续赋值
public class Dept implements Serializable { //实体类,类和表的关系映射
    private long id;
    private String name;
    private String db_source;
//微服务,可以一个服务对应一个数据库
    public Dept(String name) {
        this.name = name;
    }

/*
* Dept dept = new Dept();
* dept.setId().setName();
*
* */
}

3.新建一个新的maven项目,作为服务提供者
(通过引入依赖,从零开始实现一个springBoot项目)

<dependencies>
        <!--需要拿到实体类,所以需要这个module-->
        <dependency>
            <groupId>com.kuang</groupId>
            <artifactId>springCloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>

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

4配置文件:application.yml

server:
 port: 8001
#mybatis配饰
mybatis:
 type-aliases-package: com.kuang.springCloud.pojo
 config-location: classpath:mybatis/mybatis-config.xml
 mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
 application:
   name: springCloud-provier-dept
 datasource:
   type: com.alibaba.druid.pool.DruidDataSource
   driver-class-name: com.mysql.jdbc.Driver
   url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncode=utf-8
   username: root
   password: 987cde@

mybatis相关内容:http://t.csdn.cn/jOmpY

5.写dao层接口和对应的mapper文件
在这里插入图片描述

@Mapper
@Repository
public interface deptDao {
    public boolean addDept(Dept dept);
    public List<Dept> getDept();
    public Dept getById(long id);
}
<?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">
        <!--mybatis 核心配置文件-->
<mapper namespace="com.kuang.springcloud.dao.deptDao">
<insert id="addDept" parameterType="Dept">
 insert into dept (name,db_source)
 values (#{name},DATABASE())
</insert>
    <select id="getDept" resultType="Dept">
        select * from dept
    </select>
    <select id="getById" resultType="Dept" parameterType="long">
        select * from dept where id=#{id}
    </select>
</mapper>

6.写service和其实现类
在这里插入图片描述

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private deptDao deptdao;

    @Override
    public boolean addDept(Dept dept) {
        return deptdao.addDept(dept);
    }

    @Override
    public List<Dept> getDept() {
        return deptdao.getDept();
    }

    @Override
    public Dept getById(long id) {
        return deptdao.getById(id);
    }
}

7.写前端入口控制器

//提供Restful服务
@RestController
public class deptController {

    @Autowired
    private DeptService deptService;

    @PostMapping ("/dept/add")
    public boolean addDept(@RequestBody Dept dept){
        System.out.println(dept.getName());
        return deptService.addDept(dept);
    }

    @GetMapping ("/dept/getDept")
    public List<Dept> addDept(){
        return deptService.getDept();
    }
    @GetMapping("/dept/getById/{id}")
    public Dept getDept( @PathVariable("id") Long  id){
        return deptService.getById(id);
    }
}

8.springBoot启动类

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

9启动项目后通过Restful请求获取结果

调用接口 @GetMapping(“/dept/getById/{id}”)
在这里插入图片描述
10.新建一个服务消费者
在这里插入图片描述

新的maven工程,引入需要的pom文件

<dependencies>
        <dependency>
            <groupId>com.kuang</groupId>
            <artifactId>springCloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.7</version>
        </dependency>
    </dependencies>

application.yml只需要配置启动端口

server:
  port: 80
  tomcat:
    max-http-form-post-size: 0

11.服务消费者用到一个RestTemplate类,这个是spring提供的模板,可以有需要的方法,通过resultFul风格的请求到服务提供者。
a.首先写一个配置类,提供RestTemplate的bean对象

@Configuration
public class BeanConfig {

    @Bean
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }

}

12.写控制器,用于给前端访问


@RestController
public class CustomerController {
//消费者没有service层、
// RestTemplate 注册到spring中,供我们直接使用就可以
//  (url,实体 map,Class<T> responseType)
    //服务提供者的访问地址,参数,返回类型
    @Autowired
    private RestTemplate restTemplate;//提供多种便捷访问远程服务的模板,spring提供

    //调用服务提供中需要的服务地址前缀,后期会从注册中心获取
    private  static  final String REST_URL_PREFIX = "http://localhost:8001";
    @RequestMapping("/customer/getDept/{id}")
    public Dept getDeptById(@PathVariable("id") Long id){
        return  restTemplate.getForObject(REST_URL_PREFIX+"/dept/getById/"+id,Dept.class);
    }
    @RequestMapping("/customer/getDepts")
    public List<Dept> getDept(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/getDept",List.class);
    }
    @RequestMapping("/customer/add")
    public Boolean addDept(Dept dept){
        System.out.println(dept.getName());
        return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
    }

13.添加主启动类后,启动服务提供者和服务消费者,通过访问服务消费者,实现效果。
两个不同的访问路径,达到相同的返回结果,实际上都是通过服务提供者拿到的数据。
在这里插入图片描述
在这里插入图片描述

Spring Cloud提供了多种方式来获取服务提供者的mapping。 一种常用的方式是使用Eureka来注册服务和发现服务。在服务提供者中,我们可以通过注解`@EnableDiscoveryClient`来将服务注册到Eureka中,并在控制器中使用`@RequestMapping`来定义服务提供者的API接口。然后,在服务消费者中,通过`DiscoveryClient`来获取已注册的服务列表,并使用`RestTemplate`等HTTP客户端来调用服务提供者的API接口。 另一种方式是使用Feign来进行服务间的通信。Feign是一个声明式Web服务客户端,它使用了和Spring MVC相同的注解来定义和生成HTTP请求的接口。在服务消费者中,我们可以使用`@FeignClient`来声明要调用的服务提供者,并使用`@RequestMapping`来定义服务提供者的API接口。然后,通过Feign可以自动将接口的方法映射到服务提供者。 除了上述方式,还可以使用Ribbon和Zuul来实现服务发现和负载均衡。Ribbon是一个负载均衡客户端,它可以与Eureka配合使用,自动将请求发送到已注册的服务提供者上。Zuul是一个API网关,它充当了服务消费者服务提供者之间的中间层,可以通过Zuul来访问服务提供者的mapping。 总的来说,Spring Cloud提供了多种方式来获取服务提供者的mapping,包括使用Eureka和Feign进行服务发现和调用,使用Ribbon进行负载均衡,以及使用Zuul作为API网关等。这些方式可以根据具体的需求和场景来选择和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值