Spring Cloud(Greenwich版)-01-服务生产者与服务消费者

概念

服务生产者:服务的被调用方(即:为其他服务提供服务的服务)
服务消费者:服务的调用方(即:依赖其他服务的服务)

以微商城系统为例:用户发起购买商品请求,调用商品信息微服务是否满足购买条件,如果满足那就去查用户信息,如下图所示:


微商城系统

商品微服务是服务消费者,用户微服务就是服务生产者。
接下来以“微商城”系统为例,编写服务生产者和消费者。

编写一个服务生产者

第一步:通过start.spring.io构建服务生产者项目

打开地址:https://start.spring.io
如下图所示,选择相应信息:

构建生产者服务

增加Dependencies模块支持:
1、web
2、jpa 访问持久层
3、h2 内嵌数据库(可以做一些数据的展示)
可以直接搜索添加即可,添加完成后点击Generate the project,将会生产代码的压缩包,解压导入idea开发工具即可。

第二步:编写sql脚本

由于用的是内嵌h2数据库,所以这里编写创建用户表的sql脚本和数据:
schema.sql

drop table user if exists;
create table user(
  id bigint generated by default as identity,
  user_name varchar(40),
  name varchar(20),
  age int(3),
  balance decimal(10,2),
  primary key(id)
)

data.sql

insert into user(id,user_name,name,age,balance) values (1,'tangseng','唐僧',20,98.00);
insert into user(id,user_name,name,age,balance) values (2,'wukong','齐天大圣',18,10000.00);
insert into user(id,user_name,name,age,balance) values (3,'bajie','二师兄',25,898.00);
insert into user(id,user_name,name,age,balance) values (4,'wujing','三师弟',35,998.00);
第三步:application.ml配置文件
server:
  port: 8080
spring:
  spa:
    generate-ddl: false
    show-sql: true
    hibernate:
      ddl-auto: none
  datasource:
    platform: h2
    schema: classpath:schema.sql
    data: classpath:data.sql
logging:
  level:
    root: INFO
    org.hibernate: INFO
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
    com.itunion: DEBUG
第三步:编写User实体类
@Entity
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column
    private String userName;
    @Column
    private String name;
    @Column
    private int age;
    @Column
    private BigDecimal balance;
   ......省略get/set方法
}
第四步:编写UserRepository
@Repository
public interface UserRepository extends JpaRepository<User,Long> {
}

这里继承了JpaRepository。

第五步:编写UserController
@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @GetMapping("/simple/{id}")
    public User findById(@PathVariable Long id){
        User user = this.userRepository.getOne(id);
        System.out.println(user.toString());
        return user;
    }
}
第六步:测试

浏览器输入地址:http://127.0.0.1:8080/simple/2

{"id":2,"userName":"wukong","name":"齐天大圣","age":18,"balance":10000.00}

好了,到这里一个简单的微服务服务生产者已经编写完成。
备注:代码结构如下

服务生产者代码结构

编写一个服务消费者

第一步:通过start.spring.io构建服务消费者项目

和上面步骤一样,Artifact需要修改,如下图所示:


构建消费者服务

增加Dependencies模块支持:
1、web
只需要web就可以了,添加完成后点击Generate the project,将会生产代码的压缩包,解压导入idea开发工具。

第二步:编写User实体类
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class User {
    private Long id;
    private String userName;
    private String name;
    private int age;
    private BigDecimal balance;
    ......省略其他get/set方法
}

这里只是做一个接收数据的映射,不需要jpa的注解。

第三步:编写GoodsController
@RestController
public class GoodsController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/goods/{id}")
    public User findById(@PathVariable Long id){
        return this.restTemplate.getForObject("http://127.0.0.1:8080/simple/"+id,User.class);
    }
}

根据传入的id通过restTemplate的方式去查询服务生产者获取用户信息。

第四步:配置application.yml文件
server:
  port: 8081
第五步:启动测试

服务生产者和消费者都需要启动。
访问服务消费者地址:http://127.0.0.1:8081/goods/2
报错信息:

Description:
Field restTemplate in com.itunion.cloud.web.controller.GoodsController required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.
The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.

错误原因:RestTemplate 未实例化,MicroserviceSimpleConsumerGoodsApplication增加RestTemplate实例化代码

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

再次启动并访问:http://127.0.0.1:8081/goods/2
返回结果

{"id":2,"userName":"wukong","name":"齐天大圣","age":18,"balance":10000.00}

总结

简单的服务生产者和服务消费者已经实现了,用户在购买商品的时候调用服务消费者的goods接口,然后服务消费者通过RestTemplate调用服务生产者simple查询用户信息。
文中为了快速实现生产者和消费者的关系,采取了一些硬编码的方式,在实际分布式架构中是不行的,不过没关系后面我们慢慢来使项目更加健壮。

问题

1、生产者和消费者应用如何进行监控?并且也没有画板,啥指标都没得。没办法监控系统压力、QPS、内存、CPU和日活的可视化面板,是不是很low?
2、上面提到的硬编码问题,微服务地址和端口都是固定的,在实际项目场景中每次地址发生变更都需要去修改代码(如果用Docker容器化部署那就更酸爽了)。
3、负载均衡怎么办?
4、服务直接的容错机制如何处理?
5、用户的认证和授权呢?
6、应用发生故障,如何能够进行问题追踪快速定位?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容