4.环境搭建

1.springboot项目:

创建provider作为服务提供方

创建consumer作为服务调用方

1.provider代码示例

结构如图

1.启动类代码
    @SpringBootApplication
    public class ProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class);
        }
    }

2.控制层代码
    @RestController
    public class PersonProviderController {
        @Autowired
        private PersonProviderService providerService;
        @GetMapping(value = "/provider/getPerson")
        public Person getPerson(){
            return providerService.getPerson();
        }
    }

3.业务层代码
    @Service
    public class PersonProviderService {
        public Person getPerson() {
            return new Person("吴孟达", 18);
        }
    }
   
4.实体类代码:(实体注意要有get/set方法,有参/无参构造器)
    public class Person {
        private String name;
        private Integer age;

        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }

        public Person() {
        }

        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;
        }
    }


pom依赖
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.6</version>
        </dependency>

2.consumer代码

其他一致
启动类代码:
    @SpringBootApplication
    public class ConsumerApplication {
        //重点1:注入RestTemplate的组件用于远程调用
        @Bean
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }

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

控制层代码:
    @RestController
    public class PersonConsumerController {
        
        @Autowired
        private RestTemplate restTemplate;

        @GetMapping("/consumer/getPerson")
        public Person getPerson() {
            //重点2:使用restTemplate进行远程调用
            ResponseEntity<Person> person = restTemplate进行远程调用.getForEntity("http://localhost:8080/provider/getPerson", Person.class);
            return person.getBody();
        }
    }

项目改进为Dubbo

1.增加Dubbo依赖

     1.dubbo的stater    
    <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.0.7</version>
        </dependency>
    2.dubbo的rpc协议
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-dubbo</artifactId>
            <version>3.0.7</version>
        </dependency>
    3.dubbo的zk注册中心
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
            <version>3.0.7</version>
        </dependency>

2.配置properties

1.consumer的配置
    server.port=8081

    dubbo.application.name=consumer-application
    #zk地址
    dubbo.registry.address=zookeeper://192.168.2.128:2181

2.provider的配置
    server.port=8080

    dubbo.application.name=provider-application
    #dubbo协议名称
    dubbo.protocol.name=dubbo
    #协议端口
    dubbo.protocol.port=20880
    dubbo.registry.address=zookeeper://192.168.2.128:2181

 3.整体架构

1.common代码
    接口:
        public interface PersonServiceApi {
            public Person getPerson();
        }
    实体类:必须实现序列化接口
        public class Person implements Serializable {
            private String name;
            private Integer age;

            public Person(String name, Integer age) {
                this.name = name;
                this.age = age;
            }

            public Person() {
            }

            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;
            }
        }
provider代码:
    1.启动类
        @SpringBootApplication
        //重点1:加上EnableDubbo注解,开启dubbo功能
        @EnableDubbo
        public class ProviderApplication {
            public static void main(String[] args) {
                SpringApplication.run(ProviderApplication.class);
            }
        }
    2.业务实现层
        //重点2:加@DubboService将组件注入到容器,并且可以加入版本
        @DubboService(version = "person_verson1")
        public class PersonProviderServiceImpl implements PersonServiceApi {
            public Person getPerson() {
                return new Person("吴孟达", 18);
            }
        }
        //重点3:2版本
        @DubboService(version = "person_verson2")
        public class PersonProviderServiceImpl1 implements PersonServiceApi {
            public Person getPerson() {
                return new Person("刘丹", 18);
            }
        }
        
consumer代码:
    1.启动类代码:
        @SpringBootApplication
        //重点1:开启dubbo功能
        @EnableDubbo
        public class ConsumerApplication {
            public static void main(String[] args) {
                SpringApplication.run(ConsumerApplication.class);
            }
        }
    2.控制层代码:
        @RestController
        public class PersonConsumerController {
            //重点2:使用DubboReference租入对应的接口类,并且可以铜鼓version字段选择业务层版本
            @DubboReference(version = "person_verson1")
            PersonServiceApi personService;
            @GetMapping("/consumer/getPerson")
            public Person getPerson() {
                Person wmd = personService.getPerson();
                return wmd;
            }
        }

这时调用消费者的接口:

  

改造消费者接口:两个版本的业务层都调用下
    @RestController
    public class PersonConsumerController {
        @DubboReference(version = "person_verson1")
        PersonServiceApi personService;
        @DubboReference(version = "person_verson2")
        PersonServiceApi personService2;

        @GetMapping("/consumer/getPerson")
        public List<Person> getPerson() {
            Person wmd = personService.getPerson();
            Person ld = personService2.getPerson();
            return Arrays.asList(wmd,ld);
        }
    }

posted @ 2022-07-27 22:03  努力的达子  阅读(23)  评论(0编辑  收藏  举报