DIY message level security?
Your idea lacks forward secrecy, which protocols like TLS often (in newer versions anyway) offer. Otherwise it is close to how such things are usually done.

To get forward secrecy you would instead use an ephemeral Diffie-Hellman key exchange, which you would authenticate with the pre-shared public key (which would be a signing key, not an encryption key, where that makes a difference).

There are several alternatives for algorithms, but basically you should... do what good TLS cipher suites do. E.g. ECDH or EDH with either ECDSA or RSA signatures. AES-GCM would be a good default choice for symmetric encryption.