springcloud系列教程|第二篇:服务提供者和服务消费者

服务提供者和服务消费者

一:概念

名词概念
服务提供者服务的被调用方,为其他服务提供服务的服务
服务消费者服务消费者,依赖其他服务的服务

     举个栗子:下图的电影微服务是用户所需服务的提供者,同时也是用户微服务的消费者


二:实战演练

1:编写服务提供者

     首先:打开IDEA,然后new->project到以下界面:


     查看我的目录结构:


     下一步:查看pom文件里的依赖,需要在里面添加druid的连接池,我是采用mybatis配合连接池使用的:

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- alibaba的druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>

     下一步:编写application.yml文件:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot_study
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource
mybatis:
  mapper-locations: classpath*:mapper/*.xml  
server:
  port: 7000
logging:
  level:
    root: INFO

     下一步:编写UserMapper.xml:

<resultMap id="UserResultMap" type="com.springcloud.microserivceprovider.entity.User">

        <id property="id" column="id"/>
        <result property="age" column="age"/>
        <result property="name" column="name" javaType="java.lang.String"/>
    </resultMap>

    <select id="findUserById" parameterType="int" resultMap="UserResultMap">
        SELECT id,name,age FROM user WHERE id = #{id}
    </select>


    <insert id="addUser" parameterType="com.springcloud.microserivceprovider.entity.User" useGeneratedKeys="true" keyColumn="id">
        insert into  user
        (id,age,name)
        VALUES (
        #{id},
        #{age},
        #{name}
        )
    </insert>

    <update id="updateUser" parameterType="com.springcloud.microserivceprovider.entity.User">
        update user  set
        name=#{name} WHERE id=#{id}
    </update>

    <delete id="deleteById" parameterType="int" >
        delete from user where  id=#{id}
    </delete>

     下一步:编写UserServiceImpl:

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;
    @Override
    public User findUserById(int id) {
        return userMapper.findUserById(id);
    }

    @Override
    public int addUser(User user) {
        return userMapper.addUser(user);
    }

    @Override
    public int updateUser(User user) {
        return  userMapper.updateUser(user);
    }

    @Override
    public int deleteById(int id) {
        return userMapper.deleteById(id);
    }
}

     下一步:编写UserController:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/get/{id}")
    public User user(@PathVariable int id) {
        return userService.findUserById(id);
    }

    @PostMapping("/user/add")
    public int addUser(@RequestBody User user){
        return userService.addUser(user);
    }

    @PostMapping("/user/update")
    public int updateUser(@RequestBody User user){
        return userService.updateUser(user);
    }

    @GetMapping("/user/delete/{id}")
    public int deleteUser(@PathVariable int id){
        return userService.deleteById(id);
    }
}

     最后一步:一定要在启动程序上添加MapperScan注解,扫描mapper包:


@SpringBootApplication
@MapperScan("com.springcloud.microserivceprovider.mapper")
public class MicroserivceProviderApplication {

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

     就这样服务提供者就完成了,如果有的小伙伴搭不起来这套环境,可以参考我这篇文章:springboot结合mybatis实现增删改查

2:编写服务消费者

     环境搭建:同上,只需要添加一个web包就好了,目录如下:


     pom文件依赖如下:

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

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

     application.yml配置:

server:
  port: 7001

     UserController层,调用服务就在这里实现,RestTemplate类可以调用服务:


@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/user/{id}")
    public User findById(@PathVariable int id){
        return  this.restTemplate.getForObject("http://localhost:7000/user/get/" +id,User.class);
    }
}

     请注意,要使用RestTemplate的话,必须new一个RestTemplate出来,不然会报:Consider defining a bean of type ‘org.springframework.web.client.RestTemplate’ in your configuration.的错误:

//这里我直接将RestTemplate放到配置文件中进行管理
@SpringBootConfiguration
public class Config {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

     服务消费者也编写好了,测试结果如下:


     至此服务消费者和提供者搭建完成,但是可以发现我们的消费者的访问路径是硬编码方式,假如一个服务提供者的消费者有1000个,你突然要改变ip地址,因为微服务ip基本是动态的,那么意味着你要更改1000个微服务的地址,这工作量你敢想不,所以接下来的文章将会解决这个问题。


     源码地址:springcloud-lesson-1

     加入群聊一起学习springcloud:877750371

     如果有小伙伴觉得我写的不错的话可以关注一下我的博客,我会一直持续更新,也可以支持一下我的公众号哦:coldStone,主要会分享分布式系统相关的一系列技术,目前会推出springboot、springcloud和docker系列教程,后期会有关于中间件以及各个层面的性能优化的文章,同时还会分享一些赚钱理财的小套路哦,欢迎大家来支持,一起学习成长,程序员不仅仅是搬瓦工!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mindcarver

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

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

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

打赏作者

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

抵扣说明:

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

余额充值